【发布时间】:2015-03-09 04:37:48
【问题描述】:
我有一个想要使用 MS Test 测试的 Web API。我想特别测试一个控制器。这是初始化代码:
public class MyControllerTests
{
private static MyController controller;
[AssemblyInitialize]
public static void Initialize(TestContext context)
{
controller = new MyController();
IoC.Register(Component.For<IDbContextFactory>().ImplementedBy<MockDbContextFactory>());
// other config
}
// test methods, all async
}
这是模拟上下文工厂。是否在所有 API 方法中都使用它来获取数据库上下文。
public class MockDbContextFactory : IDbContextFactory
{
MyContext context;
public MyBaseContext GetContext()
{
if (context == null)
{
context = new MyContext(new DropCreateDatabaseAlways<MyContext>());
//populate with mock data...
}
return context;
}
}
在我为 delete 方法添加测试之前,一切都很好。它在其他方法之前完成,因此它从共享上下文中删除对象并且其他测试失败。不,我有两个想法:每个方法的新上下文(使用 [TestInitialize] 重置器),但是底层数据库仍然相同,并且在插入新的模拟对象时我遇到了很多关键冲突。另一个想法是在内存中设置一个新数据库并拥有完全独立的实例。我找到了Effort,但我认为这是一种矫枉过正的做法,而且我的做法是错误的。
我使用 Castle Windsor 作为 IoC 容器,以防万一有办法在 IoC 级别上做到这一点。
【问题讨论】:
-
巧合的是,我最近写了一篇关于使用 Effort 对您的
DbContext进行单元测试的博文。如果你决定走那条路,你可能会发现它很有趣(实际上,它很容易设置):vannevel.net/blog/2015/02/26/11 -
旁注:您的帖子中没有任何内容需要/谈论异步等待...看起来您正在谈论缺乏隐式测试排序(这是一件好事)-您会从同步调用中获得相同的失败......最好将“异步”编辑掉。
标签: c# entity-framework unit-testing async-await mstest