XUnit 模拟传递和声明一个集合

XUnit Mocking Passing and Asserting a Collection

XUnit 新手并尝试测试以下方法但测试失败。 我相信原因是在调用断言时创建了一个新的数据实例。 因此,即使认为结果相同,对象引用也不同。

当一个新记录被添加到集合中时,它应该返回添加的相同记录。

员工数据Class:

    public class EmployeeData
    {
        public int Id { get; set; }
        public string LastName { get; set; }
        public string FirstName { get; set; }
        public string Title { get; set; }

    }

测试方法:

        public List<EmployeeData> Add(List<EmployeeData> employees)
        {

            foreach(var employee in employees)
            {
                data.Add(new EmployeeData() { Id = newId(), 
                        FirstName = employee.FirstName, LastName = employee.LastName, 
                        Title = employee.Title });
            }

            return data;
        }

测试方法:

        [Fact]
        public void Add()
        {
            // Arrange
            var data = new List<EmployeeData>();

            data.Add(new EmployeeData() { Id = 1, FirstName = "Adams", LastName = "John", Title = "Fireman" });

            // Mocking the employee class constructor arguments.
            var mockLogging = new Mock<ILogger<DataService>>();
            var mockConfig = new Mock<IConfiguration>();
            var sut = new Employee(mockLogging.Object, mockConfig.Object);

            var result = sut.Add(data);

            // Assert should return the exact data inputted
            Assert.Equal(result, data);
        }

测试结果:

  Message: 
Assert.Equal() Failure
Expected: List<EmployeeData> [EmployeeData { FirstName = "Adams", Id = 1, LastName = "John", Title = "Fireman" }]
Actual:   List<EmployeeData> [EmployeeData { FirstName = "Adams", Id = 1, LastName = "John", Title = "Fireman" }]

EmployeeData 等于 EmployeeData 是什么意思? 您可以覆盖 EmployeeData class.

中的 Equals 方法
        public override bool Equals(object obj)
        {
            return this.FirstName == ((EmployeeData)obj).FirstName;
        }

第二个选项是将 IEqualityComparer<T> 传递给 Equal 方法。

    public class GenericCompare<T> : IEqualityComparer<T> where T : class
    {
        private Func<T, object> _expr { get; set; }
        public GenericCompare(Func<T, object> expr)
        {
            this._expr = expr;
        }
        public bool Equals(T x, T y)
        {
            var first = _expr.Invoke(x);
            var sec = _expr.Invoke(y);
            if (first != null && first.Equals(sec))
                return true;
            else
                return false;
        }
        public int GetHashCode(T obj)
        {
            return obj.GetHashCode();
        }
    }

并使用它:

Assert.Equal<EmployeeData>(result, data, new GenericCompare<EmployeeData>(x => x.Id));

复制粘贴 GenericCompare