如何截取IEntityRepository
本文关键字:IEntityRepository 截取 何截取 | 更新日期: 2023-09-27 18:27:44
im试图使用rhino mock在C#中截取以下代码行,但没有成功。有什么建议吗?这是导致测试失败的线路
var header = this.repository.Headers.FirstOrDefault(h => h.Id == id);
下面的全部细节,非常感谢!
单元测试
private IRepository _repository;
[TestInitialize]
public void SetUp()
{
_repository = _mockRepository.Stub<IRepository>();
_commandService = new CoreCommandService(_repository);
}
[TestMethod]
public void MyTest()
{
// Line that doesn't work
_repository.Stub(x => x.Headers).Return(SomeThing);
}
实施
// The Headers is stubbed although Id is null
var header = this.repository.Headers.FirstOrDefault(h => h.Id == id);
public interface IRepository
{
IEntityRepository<Header> Headers { get; }
}
更新#1
public interface IEntityRepository<TEntity> : IQueryable<TEntity>, IDisposable where TEntity : class
更新#2
使用以下示例
var wrapper = new HeadersWrapper(...);
_repository.Stub(x => x.Headers).Return(wrapper);
编译时返回以下消息
HeaderWrapper is not assignable to parameter type IEntityRepository<Header>
困难。
我认为你有两种选择。
如果可以将Headers
的返回类型从IEntityRepository<T>
更改为IQueryable<T>
,则可以为Headers
:返回可查询的List<T>
IList<T> list = new List<Header> { /* Some Header object */ }
IQueryable<T> queryableList = list.AsQueryable();
_repository.Stub(x => x.Headers).Return(queryableList);
如果不能更改返回类型,则需要创建一个从IEntityRepository<T>
派生的测试假类(一个新类),并包装一个可查询的List<T>
。您需要实现IEntityRepository<T>
及其接口定义的所有方法,但只需调用可查询List<T>
上的相关函数即可。然后,如上所述,将相关的Header
添加到底层可查询List<T>
,并将此对象的新实例返回到存根Headers
。
IQueryable<Header>
包装看起来像这样:
public class HeadersWrapper : IQueryable<Header>
{
private readonly IQueryable<Header> _queryableSource;
public HeadersWrapper(IEnumerable<Header> source)
{
_queryableSource = source.AsQueryable();
}
public IEnumerator<Header> GetEnumerator()
{
return _queryableSource.GetEnumerator();
}
IEnumerator IEnumerable.GetEnumerator()
{
return GetEnumerator();
}
public Expression Expression
{
get { return _queryableSource.Expression; }
}
public Type ElementType
{
get { return _queryableSource.ElementType; }
}
public IQueryProvider Provider
{
get { return _queryableSource.Provider; }
}
}
你可以这样使用它:
var headers = new List<Header>
{
new Header { Id = "foo" }
};
var wrapper = new HeadersWrapper(headers);
repo.Stub(x => x.Headers).Return(wrapper);
当然,如果你愿意的话,你可以用IQueryable<Header>
换成IEntityRepository<Header>
。