2009-07-06 19 views
10

Assert.Equals() không bao giờ gọiNUnit Assert.Equals Tôi đang thiếu gì?

Equals() 
operator == 
operator != 

Tôi có thiếu cái gì? Tôi đã thực hiện IEquatable nhưng vẫn còn các phương pháp không bao giờ được gọi là trong khi sử dụng nunit.

if (objectA != objectB) Assert.Fail(); //doesnt fail 
if (!objectA.Equals(objectB)) Assert.Fail(); //doesnt fail 
Assert.AreEqual(objectA, objectB); //fail 

CẬP NHẬT

tôi cần phải có được rõ ràng hơn.

public class Entity 
{ 
    public int ID { get; set; } 
} 

var objectA = new Entity() { ID = 1 }; 
var objectB = new Entity() { ID = 1 }; 

hai trường hợp riêng biệt cả với cùng một ID Tôi đã thực hiện tất cả các phương pháp phù hợp để thực hiện tác phẩm này với ==,! = Và Equals nhưng nunit AreSame và AreEqual vẫn thất bại trong việc gọi các phương pháp đó.

+1

Tôi có cùng một vấn đề. Bây giờ tôi đang sử dụng Assert.IsTrue (objectA.Equals (objectB)); –

+0

Tôi có cùng một vấn đề và tôi đã xác định rằng nó hoạt động nếu các đối tượng tôi so sánh là * không * cùng một tham chiếu. tức là tạo ra 2 đối tượng với các tính chất khác nhau ngoài tính bình đẳng so với tính chất, sau đó Assert.Equals hoạt động ... Nếu nó cùng tham chiếu được so sánh (chắc chắn bằng nhau) thì nó thất bại! không phải là bằng nhau (NUnit 2.5) – PandaWood

+0

Bạn đang tìm kiếm 'Assert.AreEqual (objA, objB); ' – DanielV

Trả lời

4

Bạn chắc chắn là chính xác. Tôi đã vật lộn với một số similar problem trước đó ngày hôm nay, cho đến khi tôi tìm thấy bài đăng của bạn và bây giờ chắc chắn, rằng NUnit IsEqualTo() không nhất thiết gọi các ghi đè Bằng được cung cấp.

Tôi nói một cách nhất quán, vì đôi khi có. Thực ra tôi có hai lớp. Cái thứ hai bắt nguồn từ cái đầu tiên. Khi tôi gọi Is.EqualTo() trên các phiên bản đầu tiên, NUnit gọi các giá trị Equals ghi đè, đối với các thể hiện của giá trị thứ hai thì không.

Trong khi điều đó rất đặc biệt, tôi không có thời gian để điều tra thêm về những gì đang diễn ra.

Những người có vấn đề tương tự hoặc giải pháp chắc chắn nên đăng về nó, vì đây là một điều rất khó chịu và thực sự đã cho tôi nghi ngờ tính hợp lệ của các bài kiểm tra của tôi.

Trong thời gian chờ đợi, tôi đã tạo lớp Khẳng định sau, gọi hàm ghi đè bằng cho chắc chắn (tôi đã chọn nó). Nó sử dụng NUnit để làm một Assert bình đẳng đơn giản thay vì Is.EqualTo() và phần nào khắc phục thực tế, rằng cách này NUnit không cung cấp các biểu diễn chuỗi của các đối tượng trong trường hợp kiểm tra thất bại.

Vì vậy, đây đó là:

using NUnit.Framework; 

public static class Affirm 
{ 
    public static Affirmer That(object actual) 
    { 
     return new Affirmer(actual); 
    } 
} 

[EditorBrowsable(EditorBrowsableState.Never)] 
public class Affirmer 
{ 
    readonly object _actual; 

    public Affirmer(object actual) 
    { 
     _actual = actual; 
    } 

    public void IsEqualTo(object expected) 
    { 
     string failureMessage = string.Format("\nExpected: <{0}>\nBut was: <{1}>", _actual, expected); 
     Assert.That(_actual.Equals(expected), Is.True, failureMessage); 
    } 

    public void IsNotEqualTo(object expected) 
    { 
     string failureMessage = string.Format("\nDid not excpect: <{0}>\nBut was:   <{1}>", _actual, expected); 
     Assert.That(_actual.Equals(expected), Is.False, failureMessage); 
    } 
} 

Sử dụng nó như thế này:

Affirm.That(actualObject).IsEqualTo(expectedObject); 

Affirm.That(actualObject).IsNotEqualTo(expectedObject); 

Hope this helps.

+0

Chỉ để hoàn thành: Như có thể thấy trong bài đăng gốc của bạn (http://stackoverflow.com/questions/1624848/does-nunits-is-equalto-not-work-reliably-for-classes-derived-from-generic -classe), vấn đề của bạn đã được gây ra bởi một lỗi trong ghi đè của bạn đối tượng.Equals (đối tượng). (Tôi đoán vấn đề này của OP là do lỗi tương tự.) –

+0

@FabianSchmied Tôi không nghĩ rằng đó là do lỗi trong phương thức equals bởi vì anh nói rằng Nunit thậm chí không bao giờ gọi phương thức equals của mình. Tôi đã đến đây với cùng một vấn đề. Nó sẽ không thành vấn đề gì tôi thay đổi trong phương thức Equals nếu nó không được gọi bởi Nunit – PandaWood

+0

Tôi có cùng một vấn đề nhưng thử nghiệm của tôi làm việc trước khi tôi thực hiện Equals trên lớp bản thân mình. Một cái gì đó phải đã thuyết phục NUnit để * không * gọi phương thức Equals của tôi, bây giờ tôi có một. Tôi không nghĩ rằng tôi đang chuẩn bị để điều tra mã, như tôi có thể làm cho nó hoạt động bằng cách sử dụng Assert.IsTrue (obj1.Equals (obj2)) – PandaWood

8

Sử dụng Assert.AreEqual(a, b) cho các loại giá trị, Assert.AreSame(a, b) cho các loại tham chiếu. http://www.nunit.org/index.php?p=identityAsserts&r=2.2.7

+0

Điều này vẫn nói rằng chúng không giống nhau vì một số lý do .. (nó sẽ không gọi phương thức bằng nhau của tôi) :( Những gì tôi đang cố gắng để kiểm tra là 2 trường hợp của cùng một lớp học với cùng một ID mà nên nói có họ bằng nhau – bleevo

+0

Không chắc chắn, bạn chắc chắn có thể làm Assert.IsTrue (objectA == objectB) nhưng tôi không chắc chắn lý do tại sao bạn – Robert

+1

'Assert.AreSame (a, b)' thực sự đang thực hiện 'ReferenceEquals (a, b)', và có thể không phải là những gì bạn đang tìm kiếm. Nếu bạn muốn khẳng định cùng một cá thể đối tượng, hơn là sử dụng phương thức này Nếu không, bạn có thể sử dụng tốt hơn 'Assert.AreEqual (a, b)' thay vì – Xilconic

3

Một số khuôn khổ cho phép bình đẳng hoạt động khác trước khi Id được chỉ định (ví dụ: Thực thể chưa được lưu) so với afterwarsd, khi rõ ràng rằng mục đích là Id tổ chức là cơ sở duy nhất cho chất lượng. Bạn đang sử dụng một số loại khung hoặc là thực thể lớp học của riêng bạn?

Nếu đó là lớp học của riêng bạn, bạn có thể hiển thị ý chính của logic Equals() của bạn không?

Chúc mừng, Berryl

FYI Assert.AreSame KHÔNG BAO GIỜ là một thử nghiệm để xác nhận thực hiện của bạn của IEquatable! Xem ReferenceEquals trong tài liệu trợ giúp của bạn để hiểu xác nhận đó tốt hơn.

+0

+1 cho "Assert.AreSame KHÔNG BAO GIỜ một thử nghiệm để xác thực việc thực hiện IEquatable" –

1

Nó sẽ hoạt động (xem related question) nếu phương pháp Bằng được ghi đè chính xác. Nó có thể là một vấn đề với phương pháp Equals của bạn (mặc dù nếu nó chỉ đơn giản là bao gồm int so sánh tôi sẽ nghĩ rằng không)? Có thể có giá trị thiết lập một điểm break trong phương pháp Equals của bạn và sau đó chạy thử nghiệm để xem những gì đang xảy ra đằng sau hậu trường.

+0

Tôi nghĩ rằng điểm ngắt thiết lập chính xác là những gì OP đã làm ing – zcrar70

Các vấn đề liên quan