我有一个要使用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级别上做到这一点。
我认为您可能会以错误的方式看待这个问题。
单元测试的目的是测试与任何其他单元隔离的功能单元。无需对单元测试实体框架进行全面测试。每当您创建CRUD操作的测试时,实际上就是在创建集成测试,而不是单元测试。
如果您确实需要测试CRUD操作,那么模拟工厂应该只是返回传递给它的所有操作的成功,或者在本地保存数据以返回进行验证。它不应该创建一个“测试” DbContext对象,该对象不仅必须与数据库进行交互,而且还必须与您的其他测试进行交互。您的单元测试应仅专注于验证被测函数中的操作。
现在,如果您打算执行集成测试,那么通常的做法是让测试本身插入要删除的对象。让删除测试尝试删除由另一个测试插入的记录始终会给计时带来挑战。另外,您甚至没有理由担心使用删除插入测试插入的对象DropCreateDatabaseAlways
。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句