C# 如何填写一份企业报告

C# 如何填写一份企业报告,c#,unit-testing,rhino-mocks,C#,Unit Testing,Rhino Mocks,我试图用rhino Mock在C#中存根下面的代码行,尽管没有成功。有什么建议吗?这是导致测试失败的线路 var header = this.repository.Headers.FirstOrDefault(h => h.Id == id); 详情如下,非常感谢 单元测试 private IRepository _repository; [TestInitialize] public void SetUp() { _repository = _mockRepo

我试图用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);
  }
编译时返回以下消息

  HeaderWrapper is not assignable to parameter type IEntityRepository<Header>
HeaderRapper不可分配给参数类型IEntityRepository
很难

我想你有两个选择

如果可以将
标题
的返回类型从
IEntityRepository
更改为
IQueryable
,则可以为
标题
返回可查询的
列表

IList<T> list = new List<Header> { /* Some Header object */ }
IQueryable<T> queryableList = list.AsQueryable();
_repository.Stub(x => x.Headers).Return(queryableList);
你可以这样使用它:

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);
var headers=新列表
{
新标题{Id=“foo”}
};
var wrapper=新标题包装器(标题);
repo.Stub(x=>x.Headers).Return(包装器);

当然,如果愿意,您可以将
IQueryable
交换为
IEntityRepository

测试是否因异常而失败?什么是什么东西?它是一个至少有一个条目的
IEntityRepository
集合吗?这就是我一直坚持的,不确定应该是什么:(
IEntityRepository
实现了一些集合类型,比如
IEnumerable
,我想?请提供更多详细信息-你所说的“失败”是什么意思确切地说?测试失败时发生了什么?错误是以前的方法“IRepository.get_Headers();”需要返回值或引发异常。我将对此进行调查并让您知道。感谢您努力编写一个包装查询表的假类tbh:(用包装器类更新谢谢,我用我遇到的一个问题更新了这个问题。这是一个例子,使用了
IQueryable
。我不知道你的
IEntityRepository
类是什么样子,所以我不能使用它。要解决你最近的问题,请更改
headerRapper
以实现
IEntityRepository
,并删除接口添加的任何方法。
IList<T> list = new List<Header> { /* Some Header object */ }
IQueryable<T> queryableList = list.AsQueryable();
_repository.Stub(x => x.Headers).Return(queryableList);
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);