使用模拟的单元测试存储库

时间:2016-01-15 10:38:04

标签: c# unit-testing dependency-injection mocking repository

我正在尝试编写单元测试。这是我第一次使用存储库和依赖注入。

我的unittest看起来如下:

[TestClass()]
public class PersonRepositoryTests
{
    Mock<PersonRepository> persoonRepository;
    IEnumerable<Person> personen;

    [TestInitialize()]
    public void Initialize()
    {
        persoonRepository = new Moq.Mock<PersonRepository >();
        personen = new List<Person>() { new Person { ID = 1, Name = "Bart Schelkens", GewerkteDagen = 200, Leeftijd = 52, Type = "1" },
                                        new Person { ID = 2, Name = "Yoram Kerckhofs", GewerkteDagen = 190, Leeftijd = 52, Type = "1" }};

        persoonRepository.Setup(x => x.GetAll()).Returns(personen);

    }

    [TestMethod()]
    public void GetAll()
    {
        var result = persoonRepository.Object.GetAll();
    }
}

我的存储库:

 public class PersonRepository
{
    DatabaseContext DbContext { get; }

    public PersonRepository(DatabaseContext dbContext)
    {
        this.DbContext = dbContext;
    }

    public virtual IEnumerable<Person> GetAll()
    {
        return DbContext.Persons.ToList();
    }

}

现在,当我运行测试时,出现以下错误:

“无法实例化类的代理:CoBen.Dossier.DataAccess.Repository.PersonRepository。 找不到无参数构造函数。“

所以我做错了什么,但我没有看到它。 任何人都可以帮助我吗?

3 个答案:

答案 0 :(得分:2)

发生了这个错误,因为在你的单元测试中你是模拟存储库但是你的存储库类似乎依赖于datacontext。

您需要在存储库中添加一个默认构造函数,该构造函数没有datacontext作为依赖项,如下所示:

public PersonRepository()

或模拟datacontext。希望有所帮助

答案 1 :(得分:1)

你正在模拟你的系统(sut),PersonRepository,你需要Mock是它的依赖关系:

[TestMethod]
public void GetAll()
{
    // *Arrange*
    var mockSet = new Mock<DbSet<Person>>(); 

    var mockContext = new Mock<DatabaseContext>(); 
    mockContext.Setup(m => m.Person).Returns(mockSet.Object); 

    // Configure the context to return something meaningful

    var sut = new PersonRepository(mockContext.Object);

    // *Act*
    var result = sut.GetAll()

    // *Assert* that the result was as expected
}

它有点&#34;航空代码&#34;因为你的问题没有详细说明如何配置DbContext位。

MSDN上有worked example

答案 2 :(得分:0)

尝试添加无参数构造函数:)

public PersonRepository(){}