微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么 (await DbConnection.QueryAsync<T>(sql)).ToList() 在某些情况下使用 bunit 进行测试失败,而在其他情况下会出现两个不同的错误?

如何解决为什么 (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 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?