加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c# – 添加一个Where()表达式的Mock IRavenQueryable

发布时间:2020-12-15 06:43:26 所属栏目:百科 来源:网络整理
导读:我正在为一个新的mvc3项目做一些基本的概念验证类型代码.我们正在使用Moq与RavenDB. 行动: public ActionResult Index(string id){ var model = DocumentSession.QueryFinancialTransaction() .Where(f = f.ResponsibleBusinessId == id); return View(mode
我正在为一个新的mvc3项目做一些基本的概念验证类型代码.我们正在使用Moq与RavenDB.

行动:

public ActionResult Index(string id)
{
    var model = DocumentSession.Query<FinancialTransaction>()
        .Where(f => f.ResponsibleBusinessId == id);
    return View(model);
}

测试:

private readonly Fixture _fixture = new Fixture();

[Test]
public void Index_Action_Returns_List_Of_FinancialTransactions_For_Business([Random(0,50,5)]int numberOfTransactionsToCreate)
{
    // Arrange
    var session = new Mock<IDocumentSession>();
    var financialController = new FinancialController { DocumentSession = session.Object };

    var businessId = _fixture.CreateAnonymous<string>();
    var transactions = _fixture.Build<FinancialTransaction>()
        .With(f => f.ResponsibleBusinessId,businessId)
        .CreateMany(numberOfTransactionsToCreate);

    // Mock
    var ravenQueryableMock = new Mock<IRavenQueryable<FinancialTransaction>>();
    ravenQueryableMock.Setup(x => x.GetEnumerator()).Returns(transactions.GetEnumerator);
    ravenQueryableMock.Setup(x => x.Customize(It.IsAny<Action<Object>>()).GetEnumerator()).Returns(() => transactions.GetEnumerator());

    session.Setup(s => s.Query<FinancialTransaction>()).Returns(ravenQueryableMock.Object).Verifiable(); 

    // Act
    var actual = financialController.Index(businessId) as ViewResult;

    // Assert
    Assert.IsNotNull(actual);
    Assert.That(actual.Model,Is.InstanceOf<List<FinancialTransaction>>());

    var result = actual.Model as List<FinancialTransaction>;
    Assert.That(result.Count,Is.EqualTo(numberOfTransactionsToCreate));
    session.VerifyAll();
}

这将出现在.Where(f => f.ResponsibleBusinessId == id)中的问题.从讽刺的IRavenQueryable,我返回一个FinancialTransactions列表,所以人们会认为.Where()将基于此过滤.但是由于它是IQueryable,我猜测它正在枚举的时候一直执行这个表达式.

要验证,我将操作的查询更改为:

var model = DocumentSession.Query<FinancialTransaction>()
    .ToList()
    .Where(f => f.ResponsibleBusinessId == id);

这样做让测试通过,但是它并不理想,因为这意味着它会枚举所有的记录,然后过滤它们.

有没有办法让Moq与此协同工作?

解决方法

如评论中所述,您不应该在测试中嘲笑RavenDB API.

RavenDB对单元测试有极好的支持,感谢InMemory模式:

[Test]
public void MyTest()
{
    using (var documentStore = new EmbeddableDocumentStore { RunInMemory = true })
    {
        documentStore.Initialize();

        using (var session = documentStore.OpenSession())
        {
            // test
        }
    }
}

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读