我将使用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工作,还没有找到关于该主题的具体内容。
答案 0 :(得分:1)
Marten的创作者的一段话可能与此处(context)相关:
您可以模拟一些IDocumentSession(加载,存储,保存更改, 也许通过编译查询来查询),但是您将遭受重创 如果您尝试嘲笑Linq支持。
因此,一种解决方案是进行集成测试,您可以从official Marten's repository或here中找到一些代码。