MVC4单元测试NSubstitute无法找到从中返回的调用

Tim*_*thy 3 c# asp.net-mvc unit-testing nsubstitute asp.net-mvc-4

我有一个MVC4 Web应用程序,我现在正在进行单元测试.它使用实体框架作为数据库部分.我正在使用NSubstitute来模拟数据库.这段代码基本上是从另一个工作中复制和粘贴的,工作正常,所以我希望我只是错过了一些非常简单的东西.

提前致谢!

SQL中的应用程序表:

AppID   | ApplicationName
----------------------------
1       | MyCoolApplication
2       | MyOtherApplication
Run Code Online (Sandbox Code Playgroud)

实体创建了Application类:

public class Application
{
    public int AppID { get; set; }
    public string ApplicationName { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

单元测试的模拟部分如下所示:

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
Run Code Online (Sandbox Code Playgroud)

完整的错误是:

测试方法MyProjectName.Controllers.MyControllerTest.TestOfSectionImTesting引发异常:NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException:找不到要返回的调用.

确保在调用替换后调用了Returns()(例如:mySub.SomeMethod().返回(值)),并且您没有在Returns()中配置其他替换(例如,避免这样:mySub.SomeMethod( ).Returns(ConfigOtherSub())).

如果替换了类而不是接口,请检查对替换的调用是否在虚拟/抽象成员上.无法为非虚拟/非抽象成员配置返回值.

正确使用:

mySub.SomeMethod().Returns(returnValue);
Run Code Online (Sandbox Code Playgroud)

可能有问题的用途:

mySub.SomeMethod().Returns(ConfigOtherSub());
Run Code Online (Sandbox Code Playgroud)

而是尝试:

var returnValue = ConfigOtherSub(); 

mySub.SomeMethod().Returns(returnValue);
Run Code Online (Sandbox Code Playgroud)

但这在我的环境中不起作用,因为Applications不是一种方法.就像我说的,这在我的另一个网站上工作得很好,所以它必须是我缺少的基本东西.我在网上找到的任何内容都对我的具体情况有所帮助.我更新到NSubstitute的最新版本,我卸载/重新安装,但仍然没有任何东西.

再次,在此先感谢!

Dav*_*pak 8

NSubstitute不能模拟非虚拟成员.(替代课程很多注意事项.)

MyCoolApplicationsEntities.Applications需要虚拟.Returns()才能工作.