Nib*_*Pig 1 c# unit-testing entity-framework
我一直在阅读一些关于模拟我的存储库模式EF 5的文章,我对以下几点感到困惑:
我有一个经理类,有方法说AddCat(string name);.该方法确保name有效,并调用AddCat(string name)我的CatRepository.该CatRepository少了点myContext.Cats.Add(new Cat() { Name = name });
我相信简而言之就是存储库模式.
我应该将存储库传递给Manager类,以便稍后对其进行单元测试,还是应该只测试存储库?
我想将一个上下文传递给我的存储库,以便我可以进行单元测试.所以,我想创建一个界面IMyContext,但我不知道如何让EF上下文来实现它-因为这个地方我想补充它是自动生成的代码,我担心它只是擦拭.是否有其他方法让我将自定义上下文传递给存储库?
我应该将存储库传递给Manager类,以便稍后对其进行单元测试,还是应该只测试存储库?
你应该孤立地测试每个类.您的Manager类包含实际的业务逻辑,因此您可能希望测试几个方案:
您希望确保CatRepository.Add在名称无效时不调用该名称,并且在名称有效时使用正确的名称调用它.要实现此目的,请确保您的Manager类使用接口ICatRepository.在单元测试中,您使用一种名为mocking的技术将ICatRepository的伪实现传递给Manager类.模拟具有特殊功能,可以让您检查调用哪些方法并验证这些方法的参数.
这意味着您的管理器不应构建CatRepository本身:
// Not a good solution
public class Manager
{
public Manager()
{
this.catRepository = new CatRepository();
}
}
Run Code Online (Sandbox Code Playgroud)
这样你就无法CatRepository用你的模拟版本替换它.相反,您应该使用一个名为Dependency Injection的方法:
// Seperate construction from business logic
public class Manager
{
public Manager(ICatRepository catRepository)
{
this.catRepository = catRepository;
}
}
Run Code Online (Sandbox Code Playgroud)
您CatRepository不包含任何实际逻辑.您可以使用集成测试(使用真实数据库或其他外部对象的较慢运行测试)来确保您的存储库正常运行.
我写了一个大约一年前,围绕这一主题,解释一体化和单元测试,以及如何嘲讽可以帮助你创造了良好的单元测试的区别博客:单元测试,地狱还是天堂?
我想将一个上下文传递给我的存储库,以便我可以进行单元测试.所以我创建了一个接口IMyContext,但我不知道如何让EF上下文实现它 - 因为我添加它的地方是自动生成的代码,我担心它只会擦除它.是否有其他方法让我将自定义上下文传递给存储库?
您的上下文生成为partial class.部分意味着您的类可以分布在多个.cs文件中.编译器将这些文件合并在一起并为其输出一个单独的类.这样,您可以拥有一个由EF自动生成的.cs文件和另一个实现您的界面的文件.像这样的东西:
mycontext.cs
public partial class MyContext : ObjectContext
{ }
Run Code Online (Sandbox Code Playgroud)
mycontextinterface.cs
public interface IMyContext {}
public partial class MyContext : IMyContext
{ }
Run Code Online (Sandbox Code Playgroud)