【问题标题】:How to assert list of objects for Theory MemberData?如何断言 Theory MemberData 的对象列表?
【发布时间】:2022-01-01 14:31:55
【问题描述】:

我有这个在 C# 中使用 Xunit 的集成测试代码。我的问题是如何为具有多个结果的多个对象断言?

    [Theory, MemberData(nameof(ClientIsEmptyOrNull_Data))]
    public async Task When_ClientIsEmptyOrNull_Then_ReturnErrorMessage(List<MarketingLeadDto> marketingLeadDtos, 
        List<string> expectedErrorMessages)
    {            
        using (var client = new HttpClient() { BaseAddress = new Uri(TestSettings.BaseAddress) })
        {
            _output.WriteLine("authToken: {0}", _authToken);
            client.DefaultRequestHeaders.Authorization = new AuthenticationHeaderValue("Bearer", _authToken);

            foreach (var marketingLeadDto in marketingLeadDtos)
            {
                var encodedContent = new StringContent(JsonConvert.SerializeObject(marketingLeadDto), Encoding.UTF8, "application/json");

                var response = await client.PostAsync("/ABC/Leads", encodedContent);

                var responseString = await response.Content.ReadAsStringAsync();
                _output.WriteLine("response: {0}", responseString);

                HttpStatusCode statusCode = response.StatusCode;
                Assert.Equal(HttpStatusCode.OK, statusCode);

                //expectedErrorMessages.Should().BeEquivalentTo(marketingLeadDtos);
            }
            
        }
    }

    public static TheoryData<List<MarketingLeadDto>, List<string>> ClientIsEmptyOrNull_Data()
    {
        return new TheoryData<List<MarketingLeadDto>, List<string>>
        {
            {
                new List<MarketingLeadDto>
                {
                    new MarketingLeadDto
                        {
                            AccountType = "1",
                            Salutations = "1",
                            Name = "Steven",
                            CompanyName = "",
                            Nationality = "",
                            Client = "",
                        }
                },
                new List<string>
                {
                    "Client type is required"
                }                    
            }                
        };
    }

【问题讨论】:

    标签: c# xunit


    【解决方案1】:

    我通过使用经典的 for 循环解决了这个问题。不确定是否有更好的方法。例如,FluentAssertions

                for (int x = 0; x < marketingLeadDtos.Count; x++)
                {                    
                    var encodedContent = new StringContent(JsonConvert.SerializeObject(marketingLeadDtos[x]), Encoding.UTF8, "application/json");
    
                    var response = await client.PostAsync("/ABC/Leads"
                        , encodedContent);
    
                    var responseString = await response.Content.ReadAsStringAsync();
                    _output.WriteLine("response: {0}", responseString);
    
                    HttpStatusCode statusCode = response.StatusCode;
                    Assert.Equal(HttpStatusCode.BadRequest, statusCode);
                    Assert.Equal(expectedErrorMessages[x], responseString);                    
                }   
    

    【讨论】:

      【解决方案2】:

      在那之前我遇到过类似的问题,并用下面的解决方案解决了这个问题。希望它可以帮助别人。
      [Theory]
      [ClassData(typeof(ClassName))]
      public void TestYourMethod(YourRequest request)
      {
          //Test Codes
      }
      
      
      public class ClassName: IEnumerable<object[]>
      {
          public IEnumerator<object[]> GetEnumerator()
          {
               yield return new object[]
               {
                   new YourRequest()
                        {
                           //Your properties
                        };
               };
               yield return new object[]
               {
                   new YourRequest()
                        {
                           //Your properties
                        };
               };
           }
           IEnumerator IEnumerable.GetEnumerator() => GetEnumerator();
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-02-22
        • 2021-05-31
        • 2020-01-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-27
        相关资源
        最近更新 更多