貂貂单元测试

时间:2018-08-13 02:55:14

标签: moq identityserver4 marten

我将使用PostgreSQL作为数据库,使用Marten作为ORM和使用GraphQL作为API来整合IdentityServer4的实现。到目前为止,它在运行时运行良好。但是,我也在尝试进行单元测试,并遇到了问题。我有一个IdentityServer4 IClientStore接口的自定义实现,其中FindClientByIdAsync方法的实现看起来如下:

public async Task<Client> FindClientByIdAsync(string clientId)
{
    var client = await _documentSession.Query<dbe.Client>().FirstOrDefaultAsync(c => c.ClientId == clientId);
    return _mapper.Map<Client>(client); // AutoMapper conversion call
}

这在运行时效果很好。但是,我尝试进行以下测试来消除此代码:

[Fact]
public async Task FindClientByIdReturnsClient()
{
    var clients = new []
    {
        new dbe.Client
        {
            ClientId = "123"
        }
    }.AsQueryable();

    var queryable = new MartenQueryable<dbe.Client>(clients.Provider);
    // _documentSession is a Moq Mock
    _documentSession.Setup(x => x.Query<dbe.Client>()).Returns(queryable);

    var store = new ClientStore(_documentSession.Object, _mapper);

    var result = await store.FindClientByIdAsync("123");

    Assert.NotNull(result);
    Assert.Equal("123", result.ClientId);
}

当测试尝试执行FindClientByIdAsync方法时,会发生我得到的错误:

System.InvalidCastException : Unable to cast object of type 'System.Linq.EnumerableQuery`1[StaticSphere.Persona.Data.Entities.Client]' to type 'Marten.Linq.IMartenQueryable'.

如果任何熟悉Marten的人都能提供一些见识,那就太好了!我已经完成了Google工作,还没有找到关于该主题的具体内容。

1 个答案:

答案 0 :(得分:1)

Marten的创作者的一段话可能与此处(context)相关:

  

您可以模拟一些IDocumentSession(加载,存储,保存更改,   也许通过编译查询来查询),但是您将遭受重创   如果您尝试嘲笑Linq支持。

因此,一种解决方案是进行集成测试,您可以从official Marten's repositoryhere中找到一些代码。