正确的方法来单元测试对象的类型

drl*_*drl 15 .net c# vs-unit-testing-framework

使用Visual Studio单元测试框架,我正在考虑两个选项:

Assert.AreEqual(myObject.GetType(), typeof(MyObject));
Run Code Online (Sandbox Code Playgroud)

Assert.IsInstanceOfType(myObject, typeof(MyObject));
Run Code Online (Sandbox Code Playgroud)

这两个选项之间有区别吗?一个比另一个更"正确"吗?

这样做的标准方法是什么?

Lee*_*Lee 25

如果类型不完全相同,则第一个示例将失败,而第二个示例仅在myObject不能分配给定类型时才会失败,例如

public class MySubObject : MyObject { ... }
var obj = new MySubObject();

Assert.AreEqual(obj.GetType(), typeof(MyObject));   //fails
Assert.IsInstanceOfType(obj, typeof(MyObject));     //passes
Run Code Online (Sandbox Code Playgroud)


小智 9

次要语法点:虽然上述Assert.AreEqual()语句可以工作,但参数的顺序应该颠倒,即Assert.AreEqual(Type expected, Type actual)

所以,在这种情况下: Assert.AreEqual(typeof(MyObject), obj.GetType());


小智 7

看起来 XUnit 更好:

Assert.IsType<MyClass>(myObj);
Run Code Online (Sandbox Code Playgroud)


Ima*_*mad 7

在 NUnit 中

Assert.That(myObject, Is.TypeOf<MyObject>()) //Tests exact type

Assert.That(myObject, Is.InstanceOf<MyObject>()) //Tests type and subtype

最容易理解的断言是因为 NUnit 遵循的命名:)