Я создал пользовательскую структуру для представления суммы. Это в основном обертка вокруг decimal
. У него есть оператор неявного преобразования, который возвращает его обратно в decimal
.Почему Assert.AreEqual на пользовательской структуре с неявным оператором преобразования терпит неудачу?
В моем модульном тесте я утверждаю, что сумма равна первоначальному десятичному значению, но тест не выполняется.
[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
, чтобы оба теста были успешными?
(я знаю, что я мог бы изменить тест, чтобы сделать явное преобразование, но если я не совсем есть, я не буду)
My 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;
}
}
Оба этих оператора являются «неявными». Итак, должно ли оно быть 'AreEqual' или 'AreEqual '? –
PetSerAl
@PetSerAl является правильным. если вы используете 'AreEqual' или 'AreEqual ' он пройдет. –
Nkosi