Tôi đã tạo cấu trúc tùy chỉnh để biểu thị số tiền. Về cơ bản, nó là một trình bao bọc xung quanh decimal
. Nó có toán tử chuyển đổi ẩn để truyền trở lại decimal
.Tại sao Assert.AreEqual trên cấu trúc tùy chỉnh với toán tử chuyển đổi ngầm không thành công?
Trong thử nghiệm đơn vị của mình, tôi khẳng định rằng Số tiền bằng với giá trị thập phân ban đầu, nhưng thử nghiệm không thành công.
[TestMethod]
public void AmountAndDecimal_AreEqual()
{
Amount amount = 1.5M;
Assert.AreEqual(1.5M, amount);
}
Khi tôi sử dụng một int dù (mà tôi đã không tạo ra một nhà điều hành chuyển đổi), các thử nghiệm không thành công.
[TestMethod]
public void AmountAndInt_AreEqual()
{
Amount amount = 1;
Assert.AreEqual(1, amount);
}
Khi tôi di AreEqual
, nó cho thấy rằng người đầu tiên giải quyết để
public static void AreEqual(object expected, object actual);
và điều thứ hai dẫn đến
public static void AreEqual<T>(T expected, T actual);
Dường như giá trị int
1
là ngầm truyền tới số Amount
, trong khi giá trị decimal
1.5M
thì không.
Tôi không hiểu tại sao điều này xảy ra. Tôi đã mong đợi điều ngược lại. Thử nghiệm đơn vị đầu tiên sẽ có thể truyền decimal
đến Amount
.
Khi tôi thêm một diễn viên tiềm ẩn vào int
(điều này sẽ không có ý nghĩa), kiểm tra đơn vị thứ hai cũng không thành công. Vì vậy, thêm một nhà điều hành cast tiềm ẩn phá vỡ các bài kiểm tra đơn vị.
Tôi có hai câu hỏi:
- lời giải thích cho hành vi này là gì?
- Làm cách nào để sửa cấu trúc
Amount
để cả hai thử nghiệm đều thành công?
(Tôi biết tôi có thể thay đổi thử nghiệm để làm một chuyển đổi rõ ràng, nhưng nếu tôi không hoàn toàn có, tôi sẽ không)
struct Số tiền của tôi (chỉ là một thực hiện tối thiểu để hiển thị sự cố)
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;
}
}
Cả hai toán tử của bạn đều là 'ngầm định'. Vì vậy, nó có nên là 'AreEqual 'hoặc' AreEqual '? –
PetSerAl
@PetSerAl là đúng. nếu bạn sử dụng 'AreEqual' hoặc 'AreEqual ' nó sẽ vượt qua. –
Nkosi