鉴于此代码段
[TestMethod]
public void SByte()
{
int integerValue = -129;
sbyte sbyteValueFromInt = (sbyte) integerValue;
Assert.AreEqual(sbyteValueFromInt, 127); // True
byte byteValue = (byte) integerValue;
sbyte sbyteValueFromByte= (sbyte) byteValue;
Assert.AreEqual(sbyteValueFromByte, 127); // True
sbyte? nullableSbyte = sbyteValueFromByte;
Assert.AreEqual(nullableSbyte.Value, 127); // True
Assert.AreEqual((sbyte)nullableSbyte, 127); // True
Assert.AreEqual(nullableSbyte, 127); // Assert.AreEqual failed. Expected:<127 (System.SByte)>. Actual:<127 (System.Int32)>.
}
为什么最后一个断言失败了?
如果我们深入研究AreEqual<object>
的{{1}},那么它不应该识别MSTest
转换为127
吗?
sbyte?
为什么它不知道如何将Assert.AreEqual<object>(expected, actual, message, parameters);
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
message = Assert.CreateCompleteMessage(message, parameters);
if (object.Equals((object) expected, (object) actual))
return;
Assert.HandleFailure ...
}
投射到127
但是它对sbyte
投了?
答案 0 :(得分:2)
这似乎是MSTest的 bug 功能。在使用NUnit
重复测试时,或仅使用operator ==
时,隐式转换将受到尊重。
MSTest的断言归结为:
Assert.AreEqual<object>(expected, actual, message, parameters);
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
message = Assert.CreateCompleteMessage(message, parameters);
if (object.Equals((object) expected, (object) actual))
return;
Assert.HandleFailure ...
}
通过object
过早拳击可能是罪魁祸首。
要解决这个问题,你必须向MSTest陈述明显的内容并明确地提供它,即:
Assert.AreEqual<sbyte?>(nullableSbyte, 127);
然后通过。
相比之下,NUnit Assert在没有任何帮助的情况下通过:
[Test]
public void SByte()
{
sbyte? nullableSbyte = sbyteValueFromByte;
Assert.AreEqual(nullableSbyte.Value, 127); // True
Assert.AreEqual(nullableSbyte, 127);
}
与穷人的单元测试一样:
sbyte? nullableSbyte = sbyteValueFromByte;
if (nullableSbyte.Value != 127)
{
throw new Exception("Not Equal");
}
if (nullableSbyte != 127)
{
throw new Exception("Not Equal");
}
修改强>