1

我有一个 NUnit 测试用例,它断言在ViewBagMVC 控制器的新属性中设置的类型。

所以动作体有

 using (IRepository repository = _repositoryProvider.GetRepository())
 {
      ViewBag.Articles = repository.Get<Articles>()
      return View();
 }

并尝试这样测试

 var mockProvider = new Mock<IRepositoryProvider>();
 var mockRepository = new Mock<IRepository>();
 mockProvider.Setup(m => m.GetRepository()).Returns(mockRepository.Object);
 mockRepository.Setup(m => m.Get<Articles>()).Returns(It.IsAny<IEnumerable<Articles>>);
 var homeController = new HomeController(mockProvider.Object);
 var viewResult = homeController.Index();
 Assert.That(homeController.ViewBag.Articles, Is.TypeOf<IEnumerable<Articles>>());

现在,“那个”调用会引发 RuntimeBinderException

 Microsoft.CSharp.RuntimeBinder.RuntimeBinderException : 
 The call is ambiguous between the following methods or properties:  

 NUnit.Framework.Assert.That(NUnit.Framework.Constraints.ActualValueDelegate, 
 NUnit.Framework.Constraints.IResolveConstraint) and 

 NUnit.Framework.Assert.That(NUnit.Framework.TestDelegate, 
 NUnit.Framework.Constraints.IResolveConstraint)

有没有人看到自定义动态对象的异常?我有其他测试用例,其中在 ViewBag 中设置了字符串并且它们不会遇到此异常

我也尝试过“尽可能动态”,但这也无济于事

ViewBag.Articles = repository.Get<Articles>() as dynamic;
4

2 回答 2

1

这是一个非常老的问题,所以你现在可能已经找到了答案,但由于这是我的问题的第一个谷歌结果(而且这个页面没有答案)我认为最好包括一个解法。

我相信发生的事情是,正如另一张海报所指出的那样,您的模拟存在问题导致homeController.ViewBag.Articles为空。nUnit 很难处理导致 RuntimeBinderException 的动态对象上的空值。

在您的情况下,修复您的模拟将解决问题,但在一般情况下(即,实际上想要在动态对象上使用带有 null 的 nUnit 的人),解决方法是将动态值转换为您要检查的具体类型反对,它将解决模棱两可的电话:

Assert.That((IEnumerable<Articles>)homeController.ViewBag.Articles, Is.TypeOf<IEnumerable<Articles>>());
于 2014-04-21T14:49:54.020 回答
0

您的单元测试的设置部分有错误

我不知道如何在下面的代码中输入尖括号,所以我将使用 [

mockRepository.Setup(m => m.Get[Articles]()).Returns(It.IsAny[IEnumerable[Articles]];

“返回”方法应该接收该方法应该返回的对象。It.IsAny 用于指定方法的输入参数。你必须像那样使用它。


var mock = new Mock[ITestInterface]();
mock.Setup(m => m.GetListOfMyClass(It.IsAny[int]())).Returns(new List[MyClass]());
var result = mock.Object.GetListOfMyClass(10);
Assert.That(result, Is.TypeOf[List[MyClass]]());
于 2011-05-18T21:42:29.940 回答