Tôi đang viết một số xét nghiệm đơn vị và sự khẳng định sau thất bại:Tại sao Assert.AreEqual() truyền đến đối tượng trước khi so sánh?
Assert.AreEqual(expected.Episode, actual.Episode);
Nếu tôi gọi đây là thay vào đó, nó thành công:
Assert.IsTrue(expected.Episode.Equals(actual.Episode));
tôi đã giả định rằng Assert.AreEqual()
rốt cuộc gọi phương thức Equals()
cho nhập nó, trong trường hợp này là Episode.Equals()
.
Tuy nhiên, dưới tấm chăn trong Microsoft.VisualStudio.TestTools.UnitTesting.Assert tôi thấy đoạn mã sau (dịch ngược bởi ReSharper):
public static void AreEqual<T>(T expected, T actual, string message, params object[] parameters)
{
if (object.Equals((object)expected, (object)actual))
return;
Assert.HandleFail...
}
Điều này ngụ ý với tôi rằng phương pháp AreEqual()
được đúc cảvà actual
đến object
để buộc sử dụng phương thức cơ sở Equals()
thay vì quá tải tôi đã viết trong lớp Episode
. Phương thức cơ sở sẽ chỉ kiểm tra xem các tham chiếu có giống nhau hay không.
Tôi có hai câu hỏi:
- là lời giải thích của tôi thực sự chính xác, hoặc tôi đã bị mất cái gì?
- Tại sao khung làm việc muốn sử dụng đối tượng.Equals() thay vì quá tải của phương thức đó?
Nếu nó có liên quan, đây là phương pháp của tôi:
public bool Equals(Episode other)
{
return Number == other.Number &&
CaseNote.Equals(other.CaseNote) &&
Patient.Equals(other.Patient);
}
Offtopic: phiên bản nào của ReSharper có thể dịch ngược? – sll
Tôi không chắc nó đã ở đó bao lâu nhưng ít nhất là v5 trong kinh nghiệm của tôi ... lần đầu tiên bạn F12 (đi khai báo) trên một đối tượng bên trong nó sẽ hỏi bạn muốn làm gì; một trong các tùy chọn là để dịch ngược. Ngoài ra còn có một trình giải mã độc lập miễn phí từ Jetbrains. –
btw, phương thức được hiển thị là * quá tải *, không phải là 'ghi đè'. –