Utworzono niestandardową strukturę do reprezentowania kwoty. Jest to w zasadzie opakowanie o numerze decimal
. Ma niejawnego operatora konwersji, który przesłał go z powrotem do decimal
.Dlaczego metoda Assert.AreEqual na niestandardowej strukturze z niejawnym operatorem konwersji kończy się niepowodzeniem?
W teście jednostkowym potwierdzam, że kwota jest równa oryginalnej wartości dziesiętnej, ale test kończy się niepowodzeniem.
[TestMethod]
public void AmountAndDecimal_AreEqual()
{
Amount amount = 1.5M;
Assert.AreEqual(1.5M, amount);
}
Gdy używam int choć (dla których nie stworzyć operatorowi konwersji), test ma sukces.
[TestMethod]
public void AmountAndInt_AreEqual()
{
Amount amount = 1;
Assert.AreEqual(1, amount);
}
Kiedy najechaniu AreEqual
pokazuje, że pierwszy z nich postanawia
public static void AreEqual(object expected, object actual);
a druga prowadzi do
public static void AreEqual<T>(T expected, T actual);
Wygląda wartości int
1
jest niejawnie rzutowany na Amount
, a wartość decimal
nie jest równa 1.5M
.
Nie rozumiem, dlaczego tak się dzieje. Spodziewałbym się czegoś wręcz przeciwnego. Pierwszy test jednostkowy powinien być w stanie obsłużyć decimal
do .
Po dodaniu niejawnej obsady do int
(co nie ma sensu), drugi test jednostkowy również nie powiedzie się. Zatem dodanie niejawnego operatora rzuca test jednostkowy.
Mam dwa pytania:
- Jakie jest wytłumaczenie tego zachowania?
- Jak mogę naprawić strukturę
Amount
, aby oba testy zakończyły się pomyślnie?
(wiem, że mogę zmienić test zrobić wyraźną przemianę, ale jeśli nie absolutnie trzeba, nie będę)
Moje Kwota struct (wystarczy minimalny wdrożenia do pokazać problem)
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;
}
}
Twoi operatorzy są "niejawni". Więc czy powinno to być 'AreEqual' lub 'AreEqual '? –
PetSerAl
@PetSerAl ma rację. jeśli użyjesz 'AreEqual' lub 'AreEqual ' to przejdzie. –
Nkosi