【问题标题】:Does MS Test provide a default value equals comparison?MS Test 是否提供默认值等于比较?
【发布时间】:2010-06-06 10:12:37
【问题描述】:

我想测试一下

int orderId = myRepository.SubmitOrder(orderA);

orderB = myRepository.GetOrder(orderId);

Assert.AreEqual(orderA, orderB); // fail

显然我需要在这里进行值比较,但我不想仅仅为了测试而必须为我的所有类提供覆盖的 Equals 实现(它在其余部分没有任何用处应用程序)。

是否有提供的通用方法只使用反射检查每个字段?或者如果没有,是否可以自己写?

编辑:似乎人们有点忽略了这一点。我不想编写自己的比较逻辑。这将需要数百行额外的代码。我正在寻找类似通用的东西

bool ContainSameValues<T>(T t1, T t2)

递归使用反射提取T中所有值的方法。

进一步编辑:由于似乎没有任何内置支持来执行此类操作,因此您可以看到我(失败)尝试编写自己的 here

【问题讨论】:

    标签: c# .net unit-testing testing equality


    【解决方案1】:

    最简单的做法是自己比较“原始”字段:

    Assert.AreEqual(orderA.ID, orderB.ID);    
    Assert.AreEqual(orderA.CustomerID, orderB.CustomerID);
    Assert.AreEqual(orderA.OrderDate, orderB.OrderDate);
    

    【讨论】:

    • 我的课程太多,字段太多,不实用。
    【解决方案2】:

    由于Assert 类是静态的,因此不可能在其上创建扩展方法(因为需要实例)。但是,为什么不为 Assert 类创建一个包装器,您可以在其中执行自定义断言?

    例如:

    public static class MyAssertions
    {
        public static void AreOrdersEqual(Order a, Order b)
        {
            if (!OrdersAreEqual) // your comparison logic here
               Assert.Fail("Orders arent equal");           
        }
    }
    

    然后在你的测试中:

    MyAssertions.AreOrdersEqual(orderA, orderB)
    

    【讨论】:

      【解决方案3】:

      您必须在 Order class.method 中实现 IComparable(或 ICompare?)。

      【讨论】:

        猜你喜欢
        • 2010-12-26
        • 2012-04-08
        • 1970-01-01
        • 1970-01-01
        • 2021-10-26
        • 1970-01-01
        • 2016-10-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多