我有一个 MVC4 Web 应用程序,我现在正在进行单元测试。它对数据库部分使用 Entity Framework 。我正在使用 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
完整的错误是:
但这在我的环境中不起作用,因为“应用程序”不是一种方法。就像我说的,这在我的另一个站点上很好用,所以我必须缺少一些基本知识。我在网上找到的任何东西都对我的特殊情况没有帮助。我更新到最新版本的 NSubstitute 并卸载/重新安装,但仍然一无所获。
再次,提前致谢!
最佳答案
NSubstitute 不能模拟非虚拟成员。 (有 quite a few caveats to substituting for classes 。)MyCoolApplicationsEntities.Applications
需要是虚拟的,.Returns()
才能工作。
关于c# - MVC4 单元测试 NSubstitute 找不到返回的调用,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/27301977/