【发布时间】:2016-10-05 20:02:10
【问题描述】:
我正在使用 NUnit 和 Rhino Mocks 为 C# 中的 ASP.NET MVC 应用程序编写单元测试。我在测试这个方法时遇到了一些问题:
public void Install()
{
Database.SetInitializer<DraftOrderObjectContext>(null);
var dbScript = CreateDatabaseInstallationScript();
Database.ExecuteSqlCommand(dbScript);
SaveChanges();
}
澄清一下,数据库不是指本地对象。第一个“Database.SetInitializer...”指的是:
System.Data.Entity.Database
而第二个“Database.ExecuteSqlCommand...”指的是:
System.Data.Entity.DbContext.Database
由于该方法没有返回任何内容,我认为制作一个模拟并验证 Database.ExecuteSqlCommand(dbScript); 就足够了至少被调用过一次。
现在我之前已经这样做了,但这涉及将数据库上下文传递给方法,这很容易模拟,但是在这种情况下没有参数。我需要找到一种方法来模拟“数据库”。
我已经尝试过像这样直接分配一个模拟:
System.Data.Entity.DbContext.Database = MockRepository.GenerateMock<System.Data.Entity.DbContext.Database>();
但这会破坏语法,因为该属性是只读的。
我也尝试过像这样模拟 DbContext:
System.Data.Entity.DbContext instance = MockRepository.GenerateMock<System.Data.Entity.DbContext>();
instance.Expect(someCaller => someCaller.Database.ExecuteSqlCommand("sql"))
.IgnoreArguments()
.Return(1)
.Repeat.Times(1);
但是我得到一个运行时错误,说 DbContext.getHashCode() 必须返回一个值。然后我尝试对 getHashCode 方法进行存根以使其返回某些内容,但这没有任何效果。
我对模拟还很陌生,所以我可能在这里遗漏了一些基本概念。如果是这样,我很抱歉。非常感谢任何帮助!
【问题讨论】:
-
查看answer 的相关问题
-
嗯,我不确定我是否可以使用该解决方案,因为我无法修改我需要测试的类。
-
不确定是否有办法将其作为纯单元测试来执行 - DbContext.Database 不是虚拟的,因此经典的 Mocking 场景将无法工作。也许您需要为单元测试划清界限,并将其作为集成测试?
标签: c# unit-testing mocking nunit rhino-mocks