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())).
如果替换了类而不是接口,请检查对替换的调用是否在虚拟/抽象成员上.无法为非虚拟/非抽象成员配置返回值.
正确使用:
Run Code Online (Sandbox Code Playgroud)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);
但这在我的环境中不起作用,因为Applications不是一种方法.就像我说的,这在我的另一个网站上工作得很好,所以它必须是我缺少的基本东西.我在网上找到的任何内容都对我的具体情况有所帮助.我更新到NSubstitute的最新版本,我卸载/重新安装,但仍然没有任何东西.
再次,在此先感谢!
| 归档时间: |
|
| 查看次数: |
5415 次 |
| 最近记录: |