【问题标题】:Dictionary<string, string[]> ShouldContainKeyAndValue fails unit test despite finding the expected valueDictionary<string, string[]> ShouldContainKeyAndValue 未通过单元测试,尽管找到了预期值
【发布时间】:2021-10-25 11:57:43
【问题描述】:

我使用 XUnit 和 Shouldly 编写了这个单元测试。请注意,我替换了部分命名空间、变量名、属性等,因为客户是一个大型公共组织。

[Fact]
public async void ValidateCreateXXXX_InvalidIdVersionAndStatus_Should_Fail()
{
    // Arrange
    var XXXX = new XXXX.Microservices.XXXX.Models.XXXX
    {
        Id = 1,
        CreatedDateTime = DateTime.Now,
        CreatedBy = "Test",
        UpdatedDateTime = DateTime.Now,
        UpdatedBy = "Test",
        KlientId = 1,
        Version = 0,
        Status = XXXXStatus.Oprettet
    };
    var sut = new XXXXBusinessRule();

    // Act
    var result = await sut.ValidateCreateXXXX(XXXX);

    // Assert
    result.IsSuccess.ShouldBeFalse();
    result.ResultType.ShouldBe(ResultType.Invalid);
    ((Dictionary<string, string[]>)result.Data).ShouldContainKeyAndValue("Id", new []{ "'Id' must be equal to '0'." });
}

所以问题是我的测试失败并显示以下消息:

Shouldly.ShouldAssertException : (Dictionary<string, string[]>)result.Data
should contain key
"Id"
    with value
["'Id' must be equal to '0'."]
    but value was
["'Id' must be equal to '0'."]
   at 

XXXX.Unit.BusinessRule.XXXXBusinessRuleTests.ValidateCreateXXXX_InvalidIdVersionAndStatus_Should_Fail() in C:\Source\XXXX\XXXX-udvikling\Test\XXXX.Unit\BusinessRule\XXXXBusinessRuleTests.cs:line 60
       at System.Runtime.ExceptionServices.ExceptionDispatchInfo.Throw()
       at System.Threading.Tasks.Task.<>c.<ThrowAsync>b__139_0(Object state)

请注意,预期值和实际值完全相同。这里到底发生了什么?这个错误对我来说没有多大意义。我也尝试过使用ShouldContainKey("Id"),它可以工作。那么问题一定是字符串数组?

有人可以帮我弄清楚我做错了什么吗?感谢所有帮助。

【问题讨论】:

  • 我假设应该通过引用比较数组。由于您在断言中更新了数组,因此它们在技术上并不相同。您将需要比较数组中的项目。
  • 感谢你们的cmets。所以我认为当 value 是字符串数组时,ShouldContainKeyAndValue() 方法不能轻易使用。 Shouldly 文档中也没有这方面的示例。

标签: c# .net-core xunit shouldly


【解决方案1】:

您可以通过以下断言实现相同的目的:

var errors = result.Data.ShouldBeAssignableTo<Dictionary<string, string[]>>();

errors.ShouldContainKey("Id");

errors["Id"].ShouldBe(new[] { "'Id' must be equal to '0'."})
  1. 您也可以使用ShouldBeAssignableTo 对类型进行断言,而不是显式转换result.Data
  2. 您可以使用ShouldContainKey 确保密钥存在
  3. 最后您可以使用ShouldBe 评估检索到的值

【讨论】:

  • 太棒了!那行得通。我不知道它是否回答了我原来的问题,但它绝对是我问题的解决方案。非常感谢您的快速帮助@Peter Csala
猜你喜欢
  • 1970-01-01
  • 2012-09-21
  • 1970-01-01
  • 1970-01-01
  • 2012-03-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-03
  • 1970-01-01
相关资源
最近更新 更多