C#和#x27';断言相等(账面,账面1)和#x27';即使两个对象相等,也会失败
下面是我的单元测试项目。我创建了一个单元测试,它将测试两个对象的相等性。对象通过引用传递给方法C#和#x27';断言相等(账面,账面1)和#x27';即使两个对象相等,也会失败,c#,xunit,C#,Xunit,下面是我的单元测试项目。我创建了一个单元测试,它将测试两个对象的相等性。对象通过引用传递给方法GetbookSetNameGetbookSetName负责创建一个新的book对象,并为book指定新名称 使用程序; 使用Xunit; 使用制度; 命名空间XUnitTestProject1 { 公开考试 { [事实] public void CsharpIsPassbyref() { //Get book将返回新的book对象并分配给book1 var book1=GetBook(“book
GetbookSetName
GetbookSetName
负责创建一个新的book对象,并为book指定新名称
使用程序;
使用Xunit;
使用制度;
命名空间XUnitTestProject1
{
公开考试
{
[事实]
public void CsharpIsPassbyref()
{
//Get book将返回新的book对象并分配给book1
var book1=GetBook(“book1”);
//getbookSetName方法接受book对象作为引用参数和book name。
GetbookSetName(参考书1,“新书”);
}
私有void GetbookSetName(参考图书,字符串名称)
{
图书=新书(名称);
var book1=新书(名称);
断言。相等(第1册,第1册);
}
Book GetBook(字符串名称)
{
归还新书(名称);
}
}
}
下面是图书课。它有一个构造函数,用它的名字初始化书
公共课堂教材
{
公共字符串名称;
公共图书(字符串名称)
{
名称=名称;
}
}
错误:
Assert.Equal()失败应为:图书{Name=“newbook”}
实际:图书{Name=“newbook”} 堆栈跟踪:
BookTests.GetbookSetName(Book&Book,字符串名)第55行
BookTests.CsharpIsPassbyref()第47行
引用相等和两个对象相等是不同的事情。见:
Assert.equals
用于引用相等性检查。它总是返回false。请参阅:book
和book1
可能是具有相同属性值的对象,但它们是两个不同的对象,因此不会传递断言
要检查相等性而不是引用相等性,请使用断言.AreEqual代码正在比较唯一指针并断言它们相等,这将始终为false p
public类图书测试
{
[事实]
public void CsharpIsPassbyref()
{
//Get book将返回新的book对象并分配给book1
var book1=GetBook(“book1”);//您的意思是book=newbook(name);
正在被GetbookSetName方法中的传入引用(ref book book)覆盖,对吗?现在,var book1=newbook(name);
语句将再次创建一个新实例,其属性和名称与不同内存位置中的book对象相同。book
和book1
的地址应该相同,因为它们都指向同一本书的引用,并且两个引用都具有相同的属性。因此,book的指针位置应该与book1的点相同由于两个对象具有相同的指针值,所以断言应该通过。
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);
}