ここで正しいアプローチがあるかどうかを理解するのに苦労しています。リポジトリをテストしたい。リポジトリは DbContext に依存しています。リポジトリが、DbContext のメンバーである IDbSet 型のプロパティに対して関数 Add を呼び出さなかったことを確認できるようにしたいと考えています。
私は2つのアプローチを試みました。動作で検証し、状態で検証します。スタブ化された状態が偽のオブジェクトで何をしているのか誰が知っているので、振る舞いを検証するのは正しいようです。
public void VerifyBehaviour()
{
// Arrange
var stubEntities = MockRepository.GenerateStub<IWsStatContext>();
var stubManufcturers = MockRepository.GenerateStub<IDbSet<Manufacturer>>();
var manufacturer = new Manufacturer() { Name = "Dummy" };
var manufacturers = new List<Manufacturer>();
manufacturers.Add(manufacturer);
stubManufcturers.Stub(x => x.Local).Return(new System.Collections.ObjectModel.ObservableCollection<Manufacturer>(manufacturers));
stubManufcturers.Stub(x => x.SingleOrDefault(m => m.Name == "Dummy")).Return(manufacturer);
stubEntities.Manufacturers = stubManufcturers;
// Act
var sut = new EquiptmentRepository(stubEntities);
sut.AddManufacturer(manufacturer);
// Assert
stubManufcturers.AssertWasNotCalled(x => x.Add(manufacturer));
}
public void VerifyState()
{
// Arrange
var stubEntities = MockRepository.GenerateStub<IWsStatContext>();
var stubManufacturers = new InMemoryDbSet<Manufacturer>();
var manufacturer = new Manufacturer() { Name = "Dummy" };
stubManufacturers.Add(manufacturer);
stubEntities.Manufacturers = stubManufacturers;
// Act
var sut = new EquiptmentRepository(stubEntities);
sut.AddManufacturer(manufacturer);
// Assert
Assert.AreEqual(stubManufacturers.Count(), 1);
}
SingleOrDefault のスタブ周辺で NullReferenceExceptions が発生し、動作アプローチが失敗することを確認します。そのため、状態を確認して偽の DbSet を使用するのが最善であると言っている投稿を見つけました。しかし、偽のオブジェクトの状態をチェックするのは気分が悪いです。Add 関数が実際のものとは異なる方法で実装されていたらどうなるでしょうか (元は実装されていて、リポジトリが壊れていてもテストはパスしていました)。
Add が呼び出されたことを確認できるように、SingleOrDefault をスタブする方法を知っている人はいますか? Add がライノモック以外のスタブで呼び出されたことを確認できません。
ありがとう