【发布时间】:2014-12-04 19:06:26
【问题描述】:
我有一个 MVC4 Web 应用程序,我现在正在单元测试。它对数据库部分使用实体框架。我正在使用 NSubstitute 来模拟数据库。这段代码基本上是从另一个可以正常工作的网站复制和粘贴的,所以我希望我只是错过了一些超级简单的东西。
提前致谢!
SQL 中的应用程序表:
AppID | ApplicationName
----------------------------
1 | MyCoolApplication
2 | MyOtherApplication
实体创建了应用程序类:
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(value)),而你不是 在 Returns() 中配置其他替代品(例如,避免 这个:mySub.SomeMethod().Returns(ConfigOtherSub()))。
如果您替换为类而不是接口,请检查 对您的替代者的呼叫是在虚拟/抽象成员上。返回 不能为非虚拟/非抽象成员配置值。
正确使用:
mySub.SomeMethod().Returns(returnValue);可能有问题的使用:
mySub.SomeMethod().Returns(ConfigOtherSub());改为尝试:
var returnValue = ConfigOtherSub(); mySub.SomeMethod().Returns(returnValue);
但这在我的环境中不起作用,因为应用程序不是一种方法。就像我说的,这在我的另一个网站上工作得很好,所以它必须是我所缺少的一些基本的东西。我在网上找到的任何东西都对我的特殊情况没有帮助。我更新到最新版本的 NSubstitute 并卸载/重新安装,但仍然一无所获。
再次感谢您!
【问题讨论】:
标签: c# asp.net-mvc asp.net-mvc-4 unit-testing nsubstitute