Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 检查两种类型是否等效_C#_Unit Testing_Codedom - Fatal编程技术网

C# 检查两种类型是否等效

C# 检查两种类型是否等效,c#,unit-testing,codedom,C#,Unit Testing,Codedom,出于单元测试的目的,我们想检查类的实现是否已更改。要检查的类主要包含应用程序中使用的常量或静态字段。类似于语言文件 我们的想法是,当这样一个类的实现发生变化时,通过将它与实现的最后一个可接受版本进行比较,通过失败的单元测试得到通知。我的意思是,当发生更改时,团队成员会手动审查和接受(或拒绝)此类 现在,实际的问题是:如何比较两个类是否相等 编辑 这类课程的两个例子: public class A { private string _value; private A(string

出于单元测试的目的,我们想检查类的实现是否已更改。要检查的类主要包含应用程序中使用的常量或静态字段。类似于语言文件

我们的想法是,当这样一个类的实现发生变化时,通过将它与实现的最后一个可接受版本进行比较,通过失败的单元测试得到通知。我的意思是,当发生更改时,团队成员会手动审查和接受(或拒绝)此类

现在,实际的问题是:如何比较两个类是否相等

编辑

这类课程的两个例子:

public class A
{
    private string _value;

    private A(string value)
    {
        _value = value;
    }

    public static readonly A Foo = new A("foo");
    public static readonly A Bar = new A("bar");
}


public static class B
{
    public const string Foo = "foo";
    public const string Bar = "bar";
}

@我不确定这是不是你想要的。但是您可以通过反射检查静态属性的值。也就是说,如果我要用你的例子:

var typeA = typeof(A);
var staticFieldsA = typeA.GetFields(BindingFlags.Static | BindingFlags.Public);
var typeB = typeof(B);
var staticFieldsB = typeB.GetFields(BindingFlags.Static | BindingFlags.Public);

var fooAField = staticFieldsA.Where(f => f.Name == "Foo").Single();
var fooBField = staticFieldsB.Where(f => f.Name == "Foo").Single();
var fooAValue = fooAField.GetValue(null);
var fooBValue = fooBField.GetValue(null);
// fail
Assert.AreEqual(fooAValue, fooBValue);

因此,无论实现如何(const,public static field),您都可以检查该值。

为什么需要根据上一个快照比较更改。。你们有并没有使用任何源代码控制以及我猜你们在虚拟机上编写的代码??另外,google search C#的
IEquatable
您应该在类上实现IEquatable接口,这将允许您定义相等逻辑。实际上,你也应该重写Equals方法。当然我们有。但是我不喜欢将我们的源代码控制集成到我们的单元测试中来检查一个文件的更改。你关心代码没有更改还是操作的结果没有更改?单元测试并不意味着检测代码更改——它意味着根据预期验证操作的结果。否则,我建议您考虑保护源代码管理(警报、安全性等)。@DJKRAZE:在某些情况下,我们没有实例,只有静态类。理想情况下,您应该编写足够的单元测试,无论实现中发生了什么变化,您的解决方案都将继续工作。尽管我正在搜索通用解决方案,我认为你的答案是最好的。