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);
        }