如何解决为什么 (await DbConnection.QueryAsync<T>(sql)).ToList() 在某些情况下使用 bunit 进行测试失败,而在其他情况下会出现两个不同的错误?
我尝试为 Blazor 服务器端项目中的组件 EditProposal
编写一个 bunit 测试。我有奇怪的行为,我的测试在 10 次中有 1 次没有错误地继续进行,而其他时候我得到以下错误之一:
system.invalidOperationException : BeginExecuteReader requires an open and available Connection. The connection's current state is closed.
at Microsoft.Data.sqlClient.sqlCommand.<>c.<ExecuteDbDataReaderAsync>b__188_0(Task`1 result)
有时是错误
system.invalidOperationException : The connection does not support MultipleActiveResultSets.
at Microsoft.Data.sqlClient.sqlCommand.<>c.<ExecuteDbDataReaderAsync>b__188_0(Task`1 result)
这是我的基本测试设置:
[Test]
public async Task EditProposal_ItSavesAnEditedProposal()
{
using var ctx = new TestContext();
ctx.Services.AddSingleton(_proposalService);
ctx.Services.AddSingleton(_skillableService);
ctx.JSInterop.Mode = JSRuntimeMode.Loose;
var cut = ctx.RenderComponent<EditProposal>(parameters =>
parameters.Add(p => p.Id,"1"));
cut.WaitForState(() => cut.FindAll("tr").Count > 0,TimeSpan.FromSeconds(15));
cut.Find("input").Change("TestTitle");
cut.Find("textarea").Change("A new proposal description");
cut.Find("select").Change("Beratung");
cut.Find("form").Submit();
以下方法失败:
public async Task<List<Skill>> GetAllSkillsForSkillableType(string skillableType,int skillableTypeId)
{
var sql =
$"select ParentId,s.Id,Type,Name from skill s inner join Skillable sa on sa.SkillId = s.Id inner join {skillableType} p on p.Id = sa.{skillableType}Id Where {skillableType}Id = {skillableTypeId};";
var skills = (await DbConnection.QueryAsync<Skill>(sql)).ToList();
skills = await SetAllParents(skills);
return skills;
}
正是这一行:var skills = (await DbConnection.QueryAsync<Skill>(sql)).ToList();
我在 ProposalService
中调用此方法,该方法用于将特定提案从数据库加载到我的编辑提案中:
public async Task<Proposal> GetProposalAsync(int id)
{
var parameters = new {Id = id};
var sql = "SELECT * FROM proposal WHERE id = @Id";
var result = await DbConnection.QuerySingleOrDefaultAsync<Proposal>(sql,parameters);
if (result == null) result = new Proposal();
result.Skills = await SkillableServiceAsync.GetAllSkillsForSkillableType("Proposal",result.Id);
if (result.Skills.Count == 0 && result.Equals(new Proposal())) return null;
return result;
}
这似乎与 dapper 方法有关。
这真的很奇怪,它只发生在 bunit 测试中,而不会发生在浏览器或服务方法的集成测试中。我想我可能不得不完全模拟该服务,但它似乎更像是一个错误,或者我的代码有什么问题吗?
如何在不模拟服务的情况下解决此问题?
更新
我找到了可能的答案 here。
给第二种方法另一个连接似乎使它在较少情况下失败。注意:我放弃了自己从服务中打开连接使用:
services.AddTransient<IDbConnection>(sp => new sqlConnection(DatabaseUtils.ConnectionString));
在 startup.cs
解决方法
所以给失败的线路一个自己的连接解决了这个问题:
console.log(1 === 1);
// expected output: true
console.log('1' == 1);
// expected output: true
console.log('1' === 1);
// expected output: false
console.log(0 === false);
// expected output: false
console.log(0 == false);
// expected output: true
我认为它只是 bunit 失败了,因为它的执行速度比浏览器快一点。问题是我的方法被调用了两次,但尝试使用相同的连接。因此,当一个关闭它时,另一个仍然需要访问。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。