クラスをより偽造可能でテスト可能にするには、可能であればUnitOfWork
とRepositories
を抽象化し、ファクトリを使用してそれに依存するクラスに注入することをお勧めします。
public interface IUnitOfWork : IDisposable {
... repositories
IMyEntityRepository MyEntityRepository;
...
}
そして、あなたのUnitOfWork
が
public class UnitOfWork : IUnitOfWork {...}
IUnitOfWorkFactoryそれと
public interface IUnitOfWorkFactory {
IUnitOfWork Create();
}
そのインターフェイスから派生し、依存クラスは、この
public class MyDependentClass {
private readonly IUnitOfWorkFactory unitOfWorkFactory;
public MyDependentClass (IUnitOfWorkFactory unitOfWorkFactory) {
this.unitOfWorkFactory = unitOfWorkFactory;
}
public IEnumerable<MyClass> MyMethod() {
using (var _unitOfWork = unitOfWorkFactory.Create()) {
var myEntities= _unitOfWork.MyEntityRepository.Get();
var result = ... some logic to convert myEntities collection to IEnumerable<MyClass>
return result;
}
}
}
のように見えることができます
UnitOfWork
とRepositories
を模擬/偽装することができ、コンテキストを偽造する必要がなくなりました。
は、次のようにあなたがテストを構築することができます
(私は実証の目的のためにMoq
とFluentAssert
を使用しています)あなたはUOWが実際に
MyMethod
を呼び出した後に廃棄されていることを確認/テストしたいとしましょう:
[TestMethod]
public void UOW_Should_Be_Disposed() {
//Assert
var fake_entities = Enumerable.Range(1, 10).Select(i => new MyEntity());
var mockRepository = new Mock<IMyEntityRepository>();
mockRepository.Setup(m => m.Get()).Returns(fake_entities);
var mockUOW = new Mock<IUnitOfWork>();
mockUOW.Setup(m => m.MyEntityRepository).Returns(mockRepository.Object);
var mockFactory = new Mock<IUnitOfWorkFactory>();
mockFactory.Setup(m => m.Create()).Returns(mockUOW.Object);
//Act
var sut = new MyDependentClass(mockFactory.Object);
var output = sut.MyMethod().ToList();
//Assert
output.Should().NotBeNull();
output.Should().HaveCount(10);
output.Should().ContainItemsAssignableTo<MyClass>();
mockUOW.Verify(m => m.Dispose());
}
上記の説明は、前述のフレームワークを使用して簡単にすべてをテストする方法を示しています。
希望します。
UoWクラス内でコンテキストをインスタンス化せず、代わりに(コンストラクタ)依存関係として提供します。 – spender