我如何模拟IQueryable <T>

Aar*_*ker 35 c# rhino-mocks iqueryable mocking

我正在创建一个公开IQueryable的存储库.对我的单元测试进行模拟的最佳方法是什么?

由于我在其余的模拟对象中使用RhinoMocks,我尝试执行以下操作:

IQueryable<MyObject> QueryObject = 
    MockRepository.GenerateStub<IQueryable<MyObject>>();
Run Code Online (Sandbox Code Playgroud)

这不起作用,所以我尝试这样做:

IQueryable<MyObject> QueryObject = 
    (new List<MyObject> { new MyObject() }).AsQueryable();
Run Code Online (Sandbox Code Playgroud)

有没有更好的方法来做到这一点,或者有任何其他模拟框架构建支持IQueryable?

我的存储库界面如下所示:

public interface IRepository<T> where T : TableServiceEntity
{
    IQueryable<T> Table { get; }
    void Attach(T existingItem);
    void Delete(T itemToDelete);
    void Insert(T newItem);
    T Load(string partitionKey, string rowKey);
    IEnumerable<T> Load(string partitionKey);
    IEnumerable<T> Query(IQueryable<T> query);
    IEnumerable<T> Last(int count);
    T Last();
    void Update(T item);
}
Run Code Online (Sandbox Code Playgroud)

这是我要测试的方法:

public Post LoadPost(int year, int month, int day, string slug)
{
    var query = from p in _blogRepository.Table
                where 
                    p.PartitionKey == Key.Partition(year, month, day) 
                    && p.Slug == slug
                select p;

    var posts = _blogRepository.Query(query.Take(1));

    return posts.First();
}
Run Code Online (Sandbox Code Playgroud)

然后这是测试,因为我现在有测试LoadPost.

[Fact]
public void LoadWillRetrieveByPartitionKeyAndRowKeyWhenUsingUriFormat()
{
    Repository
        .Stub(x => x.Query(Arg<IQueryable<Post>>.Is.Anything))
        .Return(new List<Post> {_post});

    var result = Service.LoadPost(
                            _post.Year(),
                            _post.Month(), 
                            _post.Day(), 
                            _post.Slug);

    Assert.NotNull(result);
}
Run Code Online (Sandbox Code Playgroud)

代码来自我的AzureBlog项目.

Grz*_*nio 10

我通常会完成您在测试中最终完成的工作.在编写测试时,我假设.Net库类正常工作并且不包含错误,因此我可以在测试中使用它们.当我需要测试列表,集合,可查询,字典等时,我只需创建真实的东西并填充测试数据.它使测试更具可读性和更快速,并且说实话,风险是不存在的.


Pat*_*ele 5

如果您想模拟您的存储库,则不会模拟 IQueryable。相反,模拟存储库的方法以返回可用于运行单元测试的固定已知值(如第二个示例)。