C# 如何对RuntimeType进行单元测试

C# 如何对RuntimeType进行单元测试,c#,.net,unit-testing,C#,.net,Unit Testing,但我有以下错误 [Test] // arrange // ... // act var result = (Car) service.GetCar(req); // assert Assert.AreEqual(result, typeof(Car)); 但这次我还是犯了错误 Assert.AreEqual(result, Is.InstanceOf<Car>()); 预期: 但是: 下面的意思是您要比较对象和类型,同时要比较对象的类型:Assert.AreEqual(r

但我有以下错误

[Test]
// arrange 
// ...
// act
var result = (Car) service.GetCar(req);

// assert
Assert.AreEqual(result, typeof(Car));  
但这次我还是犯了错误

Assert.AreEqual(result, Is.InstanceOf<Car>());
预期:
但是:

下面的意思是您要比较对象和类型,同时要比较对象的类型:
Assert.AreEqual(result,typeof(Car))

您可以使用:
Assert.AreEqual(result.GetType(),typeof(Car)),但我不确定这是否有效

但最好的选择是尝试铸造,如果铸造不成功,则失败:

Expected: <Models.Car>
But was:  <<instanceof Models.Car>>
或者您可以使用
Assert.ThrowsException()
方法来检查是否抛出了异常,但它并不像前面的方法那样直接

try
{
    var result = (Car) service.GetCar(req);
}
catch (Exception ex)
{
    Assert.Fail();
}
Action Action=()=>{var result=(Car)service.GetCar(req);};
Assert.ThrowsException(操作);

下面的意思是您要比较对象和类型,同时要比较对象的类型:
Assert.AreEqual(result,typeof(Car))

您可以使用:
Assert.AreEqual(result.GetType(),typeof(Car)),但我不确定这是否有效

但最好的选择是尝试铸造,如果铸造不成功,则失败:

Expected: <Models.Car>
But was:  <<instanceof Models.Car>>
或者您可以使用
Assert.ThrowsException()
方法来检查是否抛出了异常,但它并不像前面的方法那样直接

try
{
    var result = (Car) service.GetCar(req);
}
catch (Exception ex)
{
    Assert.Fail();
}
Action Action=()=>{var result=(Car)service.GetCar(req);};
Assert.ThrowsException(操作);

您不需要强制转换
service.GetCar(req)
的结果。这将有助于:

Action action = () => { var result = (Car) service.GetCar(req); };
Assert.ThrowsException<Exception>(action);
var result=service.GetCar(请求);
Assert.IsInstanceOf(结果);
或者,作为替代,使用:

var result = service.GetCar(req);

Assert.IsInstanceOf<Car>(result);
var result=service.GetCar(请求);
Assert.That(result,Is.TypeOf());

您不需要强制转换
service.GetCar(req)
的结果。这将有助于:

Action action = () => { var result = (Car) service.GetCar(req); };
Assert.ThrowsException<Exception>(action);
var result=service.GetCar(请求);
Assert.IsInstanceOf(结果);
或者,作为替代,使用:

var result = service.GetCar(req);

Assert.IsInstanceOf<Car>(result);
var result=service.GetCar(请求);
Assert.That(result,Is.TypeOf());

你到底想证明什么?您已经知道,
GetCar
返回特定类型的引用,因为.NET类型系统就是这样工作的。您知道它返回的对象是Car类型或其派生类型之一,否则代码将无法编译。如果要保证只返回
Car
,而不返回其派生类型,可以将其标记为
sealed
,这将防止到处派生。你到底想通过这个测试达到什么目的?你到底想证明什么?您已经知道,
GetCar
返回特定类型的引用,因为.NET类型系统就是这样工作的。您知道它返回的对象是Car类型或其派生类型之一,否则代码将无法编译。如果要保证只返回
Car
,而不返回其派生类型,可以将其标记为
sealed
,这将防止到处派生。通过这次测试,你真正想要达到什么目的?