【问题标题】:XUnit Mocking Passing and Asserting a CollectionXUnit 模拟传递和断言集合
【发布时间】:2022-01-05 07:32:28
【问题描述】:

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

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

员工数据类:

    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" }]

【问题讨论】:

  • 你能用CollectionAssert.AreEquivalent()吗?
  • @SteveWong 这不适用于 XUnit。
  • 您是否尝试过覆盖 EmployeeData 类中的 EqualsGetHashCode 方法?
  • Add方法中没有看到要声明的数据变量?
  • 结果为真。因为值相同,但它们的引用彼此不同。你可以试试这个 Enumerable.SequenceEqual(list1, list2) -> docs.microsoft.com/en-us/dotnet/api/…

标签: c# moq xunit


【解决方案1】:

EmployeeData 等于 EmployeeData 是什么意思? 您可以覆盖EmployeeData 类中的Equals 方法。

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

第二个选项是将IEqualityComparer&lt;T&gt; 传递给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));

https://stackoverflow.com/a/23623976/6629020复制粘贴的GenericCompare

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-20
    • 2020-11-21
    • 2016-10-19
    • 2017-12-14
    • 2012-02-18
    • 2021-10-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多