簡體   English   中英

從NUnit的Assert拋出的RuntimeBinderException。

[英]RuntimeBinderException thrown from NUnit's Assert.That for dynamic objects

我有一個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;

這是一個非常古老的問題,所以您現在可能已經找到了答案,但是由於這是我遇到的問題的第一個Google搜索結果(而且此頁面沒有答案),所以我認為最好包括一個解法。

我相信發生的事情是,正如其他海報指出的那樣,您的homeController.ViewBag.Articles存在問題,導致homeController.ViewBag.Articles為null。 nUnit很難在動態對象上使用null,這會導致RuntimeBinderException。

在您的情況下,修復模擬可以解決問題,但是在一般情況下(即,實際上要在動態對象上使用nUnit的nUnit的人),解決方法是將動態值轉換為要檢查的具體類型對,它將解決歧義調用:

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

您在單元測試的設置部分出錯

我不知道如何在下面的代碼中輸入尖括號,因此我將使用[

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM