簡體   English   中英

MVC4單元測試NSubstitute無法找到從中返回的調用

[英]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的最新版本,我卸載/重新安裝,但仍然沒有任何東西。

再次,在此先感謝!

NSubstitute不能模擬非虛擬成員。 替代課程很多注意事項 。)

MyCoolApplicationsEntities.Applications將需要虛擬的.Returns()工作。

這是最終的工作:

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.

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