我有一个 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/

10-09 15:28