如何存根IEntityRepository

时间:2013-08-15 14:59:52

标签: c# unit-testing rhino-mocks

我尝试使用rhino mocks在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>

1 个答案:

答案 0 :(得分:0)

困难。

我认为你有两种选择。

如果您可以将Headers的返回类型从IEntityRepository<T>更改为IQueryable<T>,则可以为List<T>返回可查询的Headers

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> Wrapper看起来像这样:

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>