从NUnit的Assert抛出的RuntimeBinderException。用于动态对象

时间:2010-12-24 00:40:08

标签: c# asp.net-mvc nunit-2.5

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

所以行动机构有

 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>>());

现在,“That”调用抛出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;

2 个答案:

答案 0 :(得分:1)

这是一个超级老问题,所以你现在可能已经找到了你的答案,但由于这是我的问题的第一个谷歌结果(这个页面没有答案)我想通了最好包括一个解决方案。

我相信正在发生的事情是,正如另一张海报所指出的,你的模拟导致homeController.ViewBag.Articles为空的问题。 nUnit在导致RuntimeBinderException的动态对象上有空的困难。

在你的情况下修复你的模拟会解决问题,但在一般情况下(即实际上想要在动态对象上使用nUnit的人),修复是将动态值强制转换为具体类型你想要检查,它将解决模糊的电话:

Assert.That((IEnumerable<Articles>)homeController.ViewBag.Articles, Is.TypeOf<IEnumerable<Articles>>());

答案 1 :(得分: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]]());