我将工作单元模式与我的数据层一起使用。
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;
}
}
(测试)使用起订量
[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)为空。我意识到这是因为我没有直接实例化属性。但我想知道是否有一种方法不必也模拟模拟内部的属性。如果不使用 Moq,那么可能还有其他一些模拟框架?