问题描述
我有一项服务,按预期工作。但是我还创建了一个集成测试来测试服务,但是不幸的是,这导致了一些问题。
我创建了一个非常简单的WebApplicationFactory,以将我的服务设置为使用内存SQL Server数据库而不是真实的数据库。添加dbContext并将其设置为内存数据库时,它在Hangfire上失败。在测试中,当用Enqueue调用Hangfire时,它给出了有关LogFactory已被处置的异常。仅当我在不同的测试类中运行多个测试时,才会发生这种情况。我还使用XUnit和IClassFixture在每个新的测试类中创建WebApplicationFactory的新实例。当我删除启用内存数据库的行时,一切正常,但它将使用appsettings.json中设置的Azure数据库。
我收到的错误消息是
function handleChange(event) {
const {name,value} = event.target;
const newObject = {
...object,[name]: value
}
setObject(newObject)
console.log('newObject',newObject)
console.log('currentObject',object)
};
Cannot access a disposed object. Object name: 'LoggerFactory'.
在原始启动Serilog中添加了
。我的自定义WebApplicationFactory:
at Microsoft.Extensions.Logging.LoggerFactory.CreateLogger(String categoryName)
at Hangfire.AspNetCore.AspNetCoreLogProvider.GetLogger(String name)
at Hangfire.Logging.LogProvider.GetLogger(String name)
at Hangfire.Logging.LogProvider.GetLogger(Type type)
at Hangfire.Client.CoreBackgroundJobFactory..ctor(IStateMachine stateMachine)
at Hangfire.Client.BackgroundJobFactory..ctor(IJobFilterProvider filterProvider)
at Hangfire.BackgroundJobClient..ctor(JobStorage storage,IJobFilterProvider filterProvider)
at Hangfire.BackgroundJobClient..ctor(JobStorage storage)
at Hangfire.BackgroundJobClient..ctor()
at Hangfire.BackgroundJob.<>c.<.cctor>b__45_0()
at System.Lazy`1.PublicationOnlyViaFactory(LazyHelper initializer)
at System.Lazy`1.CreateValue()
at System.Lazy`1.get_Value()
at Hangfire.BackgroundJob.<>c.<.cctor>b__45_1()
at Hangfire.BackgroundJob.Enqueue(Expression`1 methodCall)
at Api.Controllers.ProductController.<Import>d__10.MoveNext() in
C:\Code\API\Controllers\ProductController.cs:line 133
我尝试过:
-
在测试代码中
- services.AddHangfire(configuration => configuration.UseMemoryStorage()),以使用内存中的存储而不是数据库。
- Expliciteley还添加了HangFire应该使用SeriLogProvider的配置。
- 简化serilog配置,使其仅使用控制台写入。
有人可以通过编写集成测试和与HangFire结合使用的内存数据库来解决这个非常烦人的问题吗?就像我说的那样,当删除内存数据库配置时,一切都会按预期进行。
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)