【发布时间】:2016-11-24 19:17:15
【问题描述】:
我创建了一个自定义结构来表示金额。它基本上是decimal 的包装。它有一个隐式转换运算符将其转换回decimal。
在我的单元测试中,我断言 Amount 等于原始十进制值,但测试失败。
[TestMethod]
public void AmountAndDecimal_AreEqual()
{
Amount amount = 1.5M;
Assert.AreEqual(1.5M, amount);
}
当我使用 int 时(我没有为其创建转换运算符),测试确实成功。
[TestMethod]
public void AmountAndInt_AreEqual()
{
Amount amount = 1;
Assert.AreEqual(1, amount);
}
当我悬停AreEqual 时,它显示第一个解析为
public static void AreEqual(object expected, object actual);
第二个导致
public static void AreEqual<T>(T expected, T actual);
看起来int 值1 隐式转换为Amount,而decimal 值1.5M 不是。
我不明白为什么会这样。我的预期正好相反。第一个单元测试应该能够将decimal 转换为Amount。
当我向int 添加隐式转换时(这没有意义),第二个单元测试也失败了。所以添加一个隐式转换运算符会破坏单元测试。
我有两个问题:
- 对此行为的解释是什么?
- 如何修复
Amount结构以便两个测试都能成功?
(我知道我可以更改测试以进行显式转换,但如果我不是绝对必须这样做,我不会)
我的 Amount 结构(只是显示问题的最小实现)
public struct Amount
{
private readonly decimal _value;
private Amount(decimal value)
{
_value = value;
}
public static implicit operator Amount(decimal value)
{
return new Amount(value);
}
public static implicit operator decimal(Amount amount)
{
return amount._value;
}
}
【问题讨论】:
-
您的两个运营商都是
implicit。那么,应该是AreEqual<decimal>还是AreEqual<Amount>? -
@PetSerAl 是对的。如果您使用
AreEqual<decimal>或AreEqual<Amount>,它将通过。
标签: c# unit-testing struct implicit-conversion