c# - 我如何模拟 IQueryable<T>

标签 c# mocking rhino-mocks iqueryable

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

因为我对其余的模拟对象使用 RhinoMocks,所以我尝试执行以下操作:

IQueryable<MyObject> QueryObject = 
    MockRepository.GenerateStub<IQueryable<MyObject>>();

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

IQueryable<MyObject> QueryObject = 
    (new List<MyObject> { new MyObject() }).AsQueryable();

有没有更好的方法来做到这一点,或者是否有任何其他模拟框架内置了对 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);
}

这是我要测试的方法:

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();
}

然后这是我现在拥有的将测试 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);
}

代码取 self 的AzureBlog项目。

最佳答案

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

关于c# - 我如何模拟 IQueryable<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2242534/

相关文章:

c# - 无法加载文件或程序集 XXX 或其依赖项之一。找到的程序集的 list 定义与程序集引用不匹配

c# - 我可以判断某个属性是否已通过 Rhino Mocks 访问

c# - Rhino Mock 调用异步任务方法

c# - 制定通用和特定的 stub 方法?

c# - .NET,为什么我必须使用 *Specified 属性来强制序列化?有没有办法不这样做?

c# - .net WinForms 控件验证 - 如何显式验证所有控件

c# - 如何很好地包装 Debugger.Break?

java - 模拟测试不返回任何值Java Junit

testing - 我应该对我的代码进行多少单元测试

Python Kafka 模拟 Kafka Consumer 的返回类型