如何使用PetaPoco.Database进行单元测试服务

lju*_*mir 7 .net unit-testing rhino-mocks mocking petapoco

我在我目前的项目中使用PetaPoco作为微型ORM,我必须说我喜欢它.然而,我发现自己在使用PetaPoco.Database的简单场景 - 单元测试服务中苦苦挣扎

public class MyService : IMyService
{
    private readonly PetaPoco.Database _database;

    public MyService(PetaPoco.Database database)
    {
        _database = database;
    }

    public void SaveSomething(MyObject myObject)
    {
        //...custom logic
        _database.Save(myObject);
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在使用IoC(Castle.Windsor)在任何需要的地方注入IMyServicePetaPoco.Database.

现在,当我尝试对我的服务进行单元测试时,我无法正确模拟存根PetaPoco.Database以验证是否正确调用了Save方法.我正在使用NUnitRhino.Mocks进行单元测试和模拟.

[TestFixture]
public class MyServiceTests
{ 

    private PetaPoco.Database _database;

    [SetUp] 
    public void SetUp()
    {
        _database = MockRepository.GenerateMock<Database>("");
    }

    [Test]
    public void ShouldProperlySaveSomething()
    {
        //Arrange
        var myObject = new MyObject();
        _database.Expect(db => db.Save(Arg<MyObject>.Is.Anything));
        var myService = new MyService(_database);

        //Act
        myService.SaveSomething(myObject);

        //Assert
        _database.VerifyAllExpectations();   
    }

}
Run Code Online (Sandbox Code Playgroud)

我知道如果我从PetaPoco.Database中提取一个接口并对其进行模拟,或者通过虚拟化我想要模拟的PetaPoco方法,这可以解决,但重点是我不想对PetaPoco进行更改一点都不

这可行吗?

Sch*_*ime 4

我的分支位于此处: https: //github.com/schotime/PetaPoco已经为数据库类定义了一个接口。

另外,我的新 Fork https://github.com/schotime/NPoco或 Nuget 上的 NPoco 也具有相同的 api。

我会使用其中之一。;)