NUnit - 断言订单列表时的不明确消息

时间:2018-04-17 04:02:23

标签: c# unit-testing nunit

我创建了一个测试用例来检查列表是否已排序,如下所示

[Test]
public void Request_ShouldReturnOrderedList()
{
    //execute rest request to get json return
    var searchResult = Client.Execute(filterRequest);

    //convert Json to object
    var result = searchResult.ToObject<TheRespose>();
    Assert.That(result.Items, Is.Ordered.By("Text"));
}

详细说明,TheResponse声明如下

public class TheRespose
{
    public int MaxHits;
    public List<Items> Items;
    public int PageIndex;
    public int PageSize;
 }

项目声明如下

public class Items
{
    public int Id { get; set; }
    public string Text { get; set; }
}

测试用例在我的本地机器上传递(使用带有Resharper的Visual Studio 2017),但是,当在服务器上运行时(使用NUnit3),我得到了这个异常

Expected: collection ordered by "Text" But was:  
< <TestCase.Items>, <TestCase.Items>, <TestCase.Items>, <TestCase.Items>, 
<TestCase.Items>, <TestCase.Items>, <TestCase.Items>, 
<TestCase.Items>, <TestCase.Items>, <TestCase.Items>... > 
at TestCase.Test.Request_ShouldReturnOrderedList() 
in G:\RestTest\TestCase\Test.cs:line 112

我对C#这么新,并且不知道这条消息的麻烦。我的测试用例有什么问题?

1 个答案:

答案 0 :(得分:1)

文本排序对文化敏感:一种文化可能定义不同的排序规则而不是另一种文化。 &#34;文本&#34; property是字符串,

Is.Ordered.By("Text")

将比较&#34; Text&#34;属性(以确保它们被排序)像这样:

str1.CompareTo(str2);

这与

相同
CultureInfo.CurrentCulture.CompareInfo.Compare(str1, str2, CompareOptions.None);

因此,使用当前文化规则进行比较(以及 - 排序)。

鉴于您的结果 - 假设您的开发计算机上的当前文化与服务器上的文化不同,因此服务器测试失败,因为根据服务器文化,项目未按预期排序,这是合理的。< / p>

您需要首先确定要使用的文化,然后使用它,例如:

var culture = CultureInfo.InvariantCulture; // use correct one for your use-case
// note that there are other useful CompareOptions,
// like CompareOptions.StringSort and CompareOptions.IgnoreCase
Assert.That(result.Items, Is.Ordered.Using<string>(culture.CompareInfo.GetStringComparer(CompareOptions.None)).By("Text"));