如何截取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>

如何截取IEntityRepository

困难。

我认为你有两种选择。

如果可以将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>

相关文章:
  • 没有找到相关文章