Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用mock对存储库进行单元测试_C#_Unit Testing_Dependency Injection_Mocking_Repository - Fatal编程技术网

C# 使用mock对存储库进行单元测试

C# 使用mock对存储库进行单元测试,c#,unit-testing,dependency-injection,mocking,repository,C#,Unit Testing,Dependency Injection,Mocking,Repository,我正在尝试编写单元测试。这是我第一次使用存储库和依赖项注入来实现这一点 我的单元测试如下所示: [TestClass()] public class PersonRepositoryTests { Mock<PersonRepository> persoonRepository; IEnumerable<Person> personen; [TestInitialize()] public void Initialize() {

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

我的单元测试如下所示:

[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();
    }
}
[TestClass()]
公共类PersonRepositoryTests
{
模拟个人信息库;
可数人格;
[测试初始化()]
公共无效初始化()
{
persoonRepository=new Moq.Mock();
personen=new List(){new Person{ID=1,Name=“Bart Schelkens”,GewerkteDagen=200,Leeftijd=52,Type=“1”},
新人{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();
    }

}
公共类PersonRepository
{
DatabaseContext DbContext{get;}
公共PersonRepository(DatabaseContext dbContext)
{
this.DbContext=DbContext;
}
公共虚拟IEnumerable GetAll()
{
返回DbContext.Persons.ToList();
}
}
现在,当我运行测试时,出现以下错误:

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

所以我做错了什么,但我看不到。
有人能帮我吗?

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


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


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

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

公共PersonRepository()


或者模拟数据上下文。希望这对您有所帮助,因为在单元测试中,您模拟了存储库,但您的存储库类似乎依赖于datacontext

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

公共PersonRepository()


或者模拟数据上下文。希望这有助于

您模拟您的被测系统(sut),即PersonRepository,您需要模拟的是它的依赖项:

[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
}
[TestMethod]
public void GetAll()
{
//*安排*
var mockSet=new Mock();
var mockContext=new Mock();
Setup(m=>m.Person).Returns(mockSet.Object);
//配置上下文以返回有意义的内容
var sut=newpersonrepository(mockContext.Object);
//*法案*
var result=sut.GetAll()
//*断言*结果与预期一致
}
这有点“空代码”,因为您的问题没有太多关于如何配置DbContext位的细节


MSDN上有一个问题。

您正在模拟您的被测系统(sut),即PersonRepository,您需要模拟的是它的依赖项:

[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
}
[TestMethod]
public void GetAll()
{
//*安排*
var mockSet=new Mock();
var mockContext=new Mock();
Setup(m=>m.Person).Returns(mockSet.Object);
//配置上下文以返回有意义的内容
var sut=newpersonrepository(mockContext.Object);
//*法案*
var result=sut.GetAll()
//*断言*结果与预期一致
}
这有点“空代码”,因为您的问题没有太多关于如何配置DbContext位的细节


MSDN上有一个错误消息。

阅读错误消息…@Steve:我知道它说什么,我只是没有成功地添加DatabaseContext请记住,当您模拟存储库时,存储库中的代码永远不会被调用,因为模拟“拦截”调用并返回您指定的值。因此,您可以将存储库方法提取到一个接口,然后模拟该接口。阅读错误消息…@Steve:我知道它说什么,我只是没有成功地添加DatabaseContext请记住,当您模拟存储库时,存储库中的代码永远不会被调用,当模拟“截取”调用并返回您指定的值时。因此,您可以将存储库方法提取到一个接口并模拟它。但是,如果我想要带参数的构造函数呢?我应该如何注入databasecontext?但是如果我想要带参数的构造函数呢?如何注入databasecontext?如果我也想模拟datacontext呢?例如,我建议对databasecontext使用标记接口。如果模拟datacontext,则不必模拟存储库,因为模拟存储库不会调用datacontext模拟。例如,public PersonRepository(IDatabaseContext)。在单元测试中,您可以创建一个mock并设置您的repository=newpersonrepository(MockDatabaseContext)()。这有帮助吗?如果我也想模拟datacontext呢?例如,我建议对databasecontext使用标记接口。如果你模拟datacontext,那么你就不必模拟存储库,因为datacontext模拟不会被模拟存储库调用。例如,public PersonRepository(IDatabaseContext)。在单元测试中,您可以创建一个模拟并设置您的存储库=new PersonRepository(MockDatabaseContext)()。这有帮助吗?