我正在组合一个IdentityServer4的实现,使用PostgreSQL作为数据库,使用Marten作为ORM,使用GraphQL作为API。到目前为止,它在运行时运行得很好。然而,我也在尝试使单元测试就位,并且遇到了一个问题。我有IdentityServer4 4的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'.
如果任何人熟悉马滕可以提供一些洞察力,那就太好了!我在谷歌上花了很多时间,但在这个问题上没有发现任何具体的东西。
发布于 2018-08-13 00:51:20
这里引用了Marten创建者的一句话(上下文):
您可以模拟一些IDocumentSession (Load、Store、SaveChanges,可能是通过编译的查询进行查询),但是如果您试图模拟Linq支持,您将处于一个充满伤害的世界。
因此,一种解决方案是进行集成测试,您可以从官方的Marten储存库或这里中找到一些代码。
https://stackoverflow.com/questions/51814633
复制相似问题