データレイヤーで Unit Of Work パターンを使用しています。
public interface IUnitOfWork{
IRepository<Class1> Class1s {get;}
IRepository<Class2> Class2s {get;}
...
}
public interface IRepository<T> where T:class{
IQueryable<T> GetAll();
}
これは私のコードベースで期待どおりに機能しています。ただし、サービス層でこれをテストする際に問題があります。
public class SomeService{
private readonly IUnitOfWork uow;
public SomeService(IUnitOfWork u){
uow = u;
}
public IEnumerable<ViewModel1> GetViewModel(){
var result1 = uow.Class1s.GetAll();
var result2 = uow.Class2s.GetAll();
var query = from r1 in result1
from r2 in result2
where r1.key == r2.key
select new ViewModel1{...};
return result;
}
}
(テスト)Moqを使用
[Test]
public void TestMethod(){
var uow = new Mock<IUnitOfWork>();
uow.Setup(u => u.Class1s.GetAll()).Returns(new []{ new Class1{...}}.AsQueryable());
uow.Setup(u => u.Class2s.GetAll()).Returns(new []{ new Class2{...}}.AsQueryable());
var service = new SomeService(uow.Object);
var result = service.GetViewModel();
Assert.AreEqual(1,result.Count());
}
テストは、result1 (および result2) が null であることを示す例外をスローしています。これは、プロパティを直接インスタンス化していないためであることに気付きました。しかし、モック内のプロパティもモックする必要がない方法があるかどうか疑問に思っていました。Moq を使用していない場合は、他のモッキング フレームワークでしょうか。