1

我试图使用 rhino 模拟在 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>
4

1 回答 1

0

难的。

我认为你有两个选择。

如果可以将Headersfrom的返回类型更改IEntityRepository<T>IQueryable<T>,则可以返回可查询List<T>的 for 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>的对象,并将该对象的新实例返回给 stub 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>

于 2013-08-15T16:05:00.990 回答