[英]MVC4 Unit test NSubstitute Could not find a call to return from
我有一個MVC4 Web應用程序,我現在正在進行單元測試。 它使用實體框架作為數據庫部分。 我正在使用NSubstitute來模擬數據庫。 這段代碼基本上是從另一個工作中復制和粘貼的,工作正常,所以我希望我只是錯過了一些非常簡單的東西。
提前致謝!
SQL中的應用程序表:
AppID | ApplicationName
----------------------------
1 | MyCoolApplication
2 | MyOtherApplication
實體創建了Application類:
public class Application
{
public int AppID { get; set; }
public string ApplicationName { get; set; }
}
單元測試的模擬部分如下所示:
var mockDb = Substitute.For<MyCoolApplicationsEntities>();
var applications = new List<Application>
{
new Application {AppID = 1, ApplicationName = "MyCoolApplication"},
new Application {AppID = 2, ApplicationName = "MyOtherApplication"},
};
var mockApplicationSet = Substitute.For<IDbSet<Application>, DbSet<Application>>();
mockApplicationSet.Provider.Returns(applications.AsQueryable().Provider);
mockApplicationSet.Expression.Returns(applications.AsQueryable().Expression);
mockApplicationSet.ElementType.Returns(applications.AsQueryable().ElementType);
mockApplicationSet.GetEnumerator().Returns(applications.AsQueryable().GetEnumerator());
mockApplicationSet.When(q => q.Add(Arg.Any<Application>()))
.Do(q => applications.Add(q.Arg<Application>()));
mockApplicationSet.When(q => q.Remove(Arg.Any<Application>()))
.Do(q => applications.Remove(q.Arg<Application>()));
mockDb.Applications.Returns(mockApplicationSet); //This is the line creating the error
完整的錯誤是:
測試方法MyProjectName.Controllers.MyControllerTest.TestOfSectionImTesting引發異常:NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException:找不到要返回的調用。
確保在調用替換后調用了Returns()(例如:mySub.SomeMethod()。返回(值)),並且您沒有在Returns()中配置其他替換(例如,避免這樣:mySub.SomeMethod( ).Returns(ConfigOtherSub()))。
如果替換了類而不是接口,請檢查對替換的調用是否在虛擬/抽象成員上。 無法為非虛擬/非抽象成員配置返回值。
正確使用:
mySub.SomeMethod().Returns(returnValue);
可能有問題的用途:
mySub.SomeMethod().Returns(ConfigOtherSub());
而是嘗試:
var returnValue = ConfigOtherSub(); mySub.SomeMethod().Returns(returnValue);
但這在我的環境中不起作用,因為Applications不是一種方法。 就像我說的,這在我的另一個網站上工作得很好,所以它必須是我缺少的基本東西。 我在網上找到的任何內容都對我的具體情況有所幫助。 我更新到NSubstitute的最新版本,我卸載/重新安裝,但仍然沒有任何東西。
再次,在此先感謝!
這是最終的工作:
var context = Substitute.For<MyCoolApplicationsEntities>();
var applications = new List<Application>
{
new Application {AppID = 1, ApplicationName = "MyCoolApplication"}
};
var mockApplications = Substitute.For<DbSet<Application>, IQueryable<Application>>();
((IQueryable<Application>)mockApplications).Provider.Returns(applications.AsQueryable().Provider);
((IQueryable<Application>)mockApplications).Expression.Returns(applications.AsQueryable().Expression);
((IQueryable<Application>)mockApplications).ElementType.Returns(applications.AsQueryable().ElementType);
((IQueryable<Application>)mockApplications).GetEnumerator().Returns(applications.AsQueryable().GetEnumerator());
mockApplications.When(q => q.Add(Arg.Any<Application>()))
.Do(q => applications.Add(q.Arg<Application>()));
mockApplications.When(q => q.Remove(Arg.Any<Application>()))
.Do(q => applications.Remove(q.Arg<Application>()));
context.Applications = mockApplications;
我看不到你的類,但你需要創建與虛擬成員的接口,並讓你的代碼通過接口調用類,然后你就可以模擬出類了。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.