RuntimeBinderException, выброшенный из NUnit's Assert.That для динамических объектов - PullRequest
1 голос
/ 24 декабря 2010

У меня есть тестовый пример NUnit, который утверждает тип, установленный в новом свойстве ViewBag контроллера MVC.

Итак, тело действия имеет

 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 ]

1 голос
/ 21 апреля 2014

Это очень старый вопрос, поэтому вы, вероятно, уже нашли свой ответ, но так как это был первый результат Google для моей проблемы (а на этой странице не было ответа), я понял было бы хорошо, чтобы включить решение.

Я полагаю, что то, что происходило, заключается в том, что, как указывалось на другом плакате, была проблема с вашими насмешками, из-за которых homeController.ViewBag.Articles был нулевым. nUnit испытывает трудности с нулевыми значениями для динамического объекта, который вызывал исключение RuntimeBinderException.

В вашем случае исправление вашей имитации решило бы проблему, но в общем случае (т.е. тот, кто на самом деле хочет использовать nUnit с нулем для динамического объекта), исправление заключается в приведении динамического значения к конкретному типу хотите проверить, и это решит неоднозначный вызов:

Assert.That((IEnumerable<Articles>)homeController.ViewBag.Articles, Is.TypeOf<IEnumerable<Articles>>());
0 голосов
/ 19 мая 2011

У вас есть ошибка в части настройки Вашего модульного теста

Я не знаю, как ввести угловую скобку в приведенном ниже коде, поэтому я буду использовать [

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

метод 'Returns'должен получить объект, который должен вернуть метод.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]]());
...