如果您的系统具有多种类型的对象上下文。对于Eg:BillingObjectContext,HumanResourceObjectContext等。所有派生自ObjectContext但ObjectContext类不实现任何特定的接口,如IObjectContext。如果有多种类型的ObjectContext说使用Ninject?
,你会如何应用DI / IoC?答案 0 :(得分:6)
如果你必须在测试中依赖它,你必须嘲笑它。 Here's a sample;它并不比实现接口困难得多。另请参阅TDD improvements in EF 4。
答案 1 :(得分:0)
为什么我们不能只创建在我们的测试中使用的实际上下文对象?由于我们不希望我们的测试影响生产数据库,因此我们始终可以指定指向测试数据库的连接字符串。在运行每个测试之前,构建一个新的上下文,添加测试中需要的数据,继续单元测试,然后在测试清理部分中,删除测试期间创建的所有记录。这里唯一的副作用是自动增量ID将在测试数据库中用完,但因为它是一个测试数据库 - 谁在乎呢?
我知道关于这个问题的大多数答案建议使用DI / IoC设计来为数据上下文等创建接口,但我使用Entity Framework的原因正是为我的数据库连接,对象模型和简单编写任何接口CRUD交易。为我的数据对象编写模拟接口并编写复杂的可查询对象以支持LINQ,无法依赖经过高度测试和可靠的Entity Framework。
这种单元测试模式并不新颖 - Ruby on Rails已经使用了很长时间,而且效果很好。就像.NET提供EF一样,RoR提供ActiveRecord个对象,每个单元测试创建它需要的对象,继续测试,然后删除所有构造的记录。
如何为测试环境指定连接字符串?由于所有测试都在他们自己的专用测试项目中,因此添加一个带有测试数据库连接字符串的新App.Config
文件就足够了。
想想这会拯救你多少头痛和疼痛。
namespace ProjectNamespace
{
[TestClass]
public class UnitTest1
{
private ObjectContext objContext;
[TestInitialize]
public void SetUp()
{
// Create the object context and add all the necessary data records.
}
[TestMethod]
public void TestMethod1()
{
// Runs the tests.
}
[TestCleanup]
public void CleanUp()
{
// Delete created records.
}
}
}