Xunit.Assert.Collection中的问题 - C#

11 c# collections unit-testing assert xunit

我有一个类库,它包含以下模型和方法

模型:

public class Employee {
    public int EmpId { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

方法:

public class EmployeeService {
    public List<Employee> GetEmployee() {
        return new List<Employee>() {
            new Employee() { EmpId = 1, Name = "John" },
            new Employee() { EmpId = 2, Name = "Albert John" },
            new Employee() { EmpId = 3, Name = "Emma" },
        }.Where(m => m.Name.Contains("John")).ToList();
    }
}
Run Code Online (Sandbox Code Playgroud)

我有一个测试方法

[TestMethod()]
public void GetEmployeeTest() {
    EmployeeService obj = new EmployeeService();
    var result = obj.GetEmployee();
    Xunit.Assert.Collection<Employee>(result, m => Xunit.Assert.Contains("John",m.Name));
}
Run Code Online (Sandbox Code Playgroud)

我收到了一条Exception消息

Assert.Collection() Failure
Collection: [Employee { EmpId = 1, Name = "John" }, Employee { EmpId = 2, Name = "Albert John" }]
Expected item count: 1
Actual item count:   2
Run Code Online (Sandbox Code Playgroud)

我的要求是检查所有items.Name应该包含子字符串"John".请帮助我检查如何使用Xunit.Assert.Collection

Ayb*_*btu 34

似乎Assert.Collection只使用每个元素检查器一次.因此,对于您的测试,以下工作:

[Fact]
public void GetEmployeeTest()
{
    EmployeeService obj = new EmployeeService();
    var result = obj.GetEmployee();

    Assert.Collection(result, item => Assert.Contains("John", item.Name),
                              item => Assert.Contains("John", item.Name));
}
Run Code Online (Sandbox Code Playgroud)

但这意味着result必须有两个项目.

改变Assert

Assert.All(result, item => Assert.Contains("John", item.Name));
Run Code Online (Sandbox Code Playgroud)

应该给你你期望的结果.