8

現在のプロジェクトで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);
    }
}

IMyServicePetaPoco.Databaseの両方を必要に応じて注入するためにIoC (Castle.Windsor) を使用しています。

今、サービスを単体テストしようとすると、 Saveメソッドが適切に呼び出されたことを確認するためにスタブPetaPoco.Databaseを適切にモックできません。単体テストとモックには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();   
    }

}

これは、 PetaPoco.Databaseから Interface を抽出してそれに対してモックを作成するか、モックしたい PetaPoco のメソッドを仮想化することで解決できることは承知していますが、ポイントはPetaPocoに変更を加えたくないということですまったく。

これは実行可能ですか?

4

2 に答える 2

4

ここにある私のブランチ: https://github.com/schotime/PetaPocoには、すでに Database クラス用に定義されたインターフェースがあります。

また、同じ api を持つ新しいフォークhttps://github.com/schotime/NPocoまたは NPoco on nuget があります。

私はこれらのいずれかを使用します。;)

于 2012-05-28T08:36:00.017 に答える
1

IMyService インタラクションを使用して PetaPoco.Database とのインタラクションを既に抽象化しているのに、別の抽象化が必要なのはなぜですか? 現在のアプローチでは、IMyService を使用してデータベースとのやり取りをテストできるはずです。

public class AuthenticationService 
{
    private IMyService myService;

    public AuthenticationService(IMyService service) 
    {
        ...
    }

    public void Authenticate(string username, string password)
    {
       var user = myService.GetUser(username); // <-- Hits the database
    }
}

それをテストするには、IMyService のモック/スタブを使用してインタラクションをモックするだけです。

元のソリューションに関して、PetaPoco パブリック メソッドが仮想でない場合は、フォークしてコードを修正し、プル リクエストを送信します。そうでなければ、あなたのアプローチは私にはうまく見えます。

于 2012-05-28T03:23:26.073 に答える