我创建了一个测试用例来检查列表是否已排序,如下所示
[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#这么新,并且不知道这条消息的麻烦。我的测试用例有什么问题?
答案 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"));