我有一个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;
答案 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]]());