下面是我的单元测试项目。我创建了一个单元测试,它将测试两个对象的相等性。对象是通过引用方法GetbookSetName
传递的。GetbookSetName
负责创建一个新的图书对象,并为图书指定新名称。
using Programme;
using Xunit;
using System;
namespace XUnitTestProject1
{
public class BookTests
{
[Fact]
public void CsharpIsPassbyref()
{
// Get book will return new book object and assigned to book1
var book1 = GetBook("book1");
//getbookSetName method accepts book object as reference parameter and book name.
GetbookSetName(ref book1, "New Book");
}
private void GetbookSetName(ref Book book, string name)
{
book = new Book(name);
var book1 = new Book(name);
Assert.Equal(book, book1);
}
Book GetBook(string name)
{
return new Book(name);
}
}
}
下面是图书课。它有一个构造函数,用它的名字初始化书。
public class Book
{
public string Name;
public Book(string name)
{
Name = name;
}
}
错误:
Assert.Equal((失败
预期:Book{Name="New Book}堆栈跟踪:
BookTests.GetbookSetName(Book&Book,字符串名称(第55行
BookTests.CsharpIsPassbyref((第47行
代码比较唯一指针并断言它们相等,这将始终为false。
p
ublic class BookTests
{
[Fact]
public void CsharpIsPassbyref()
{
// Get book will return new book object and assigned to book1
var book1 = GetBook("book1"); // <<< instance A
//getbookSetName method accepts book object as reference parameter and book name.
GetbookSetName(ref book1, "New Book"); // << passing instance A to func
}
private void GetbookSetName(ref Book book, string name)
{
book = new Book(name); // <<< overwrite instance A with instance B
var book1 = new Book(name); // <<< new instance C
Assert.Equal(book, book1); // <<< comparing addresses of instance B to instance C
}
Book GetBook(string name)
{
return new Book(name);
}
如果代码打算比较包含相同内部状态的对象,则重写Equals((方法或==运算符来比较各个成员变量值。
引用相等和两个对象的相等是不同的。参见:这个问题
Assert.equals
用于参考相等性检查。它总是返回false。请参阅:MS文档。book
和book1
可能是具有相同属性值的对象,但它们是两个不同的对象,因此不会传递断言。
要检查相等性而不是参考相等性,请使用Assert.AreEqual
我遇到了这个问题,并最终覆盖了类中的Equals方法,该方法检查两个对象中的每个属性以查看它们是否相等:
public override bool Equals(object obj)
{
return GetType().GetProperties().All(property => property.GetValue(this) == property.GetValue(obj));
}