現在のプロジェクトで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);
}
}
IMyServiceとPetaPoco.Databaseの両方を必要に応じて注入するためにIoC (Castle.Windsor) を使用しています。
今、サービスを単体テストしようとすると、 Saveメソッドが適切に呼び出されたことを確認するためにスタブPetaPoco.Databaseを適切にモックできません。単体テストとモックにはNUnitとRhino.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に変更を加えたくないということですまったく。
これは実行可能ですか?