Search code examples
c#linqfluent-assertions

Fluent Assertions between two collection class


I have a class with collection class inside

public class SearchResult {
        public int Id { get; set; }
        public int Total { get; set; }
        public IEnumerable<Book> Books { get; set; }
}

public class Book {
        public int BookId { get; set; }
        public string BookName { get; set; }
        public string Publisher { get; set; }
        public string ISBNCode { get; set; }
        public IList<catagory> Catagories { get; set; }
}

I have a question , if I create the other object , with same structure of SearchResult and I want to copy SearchResult to SearchResultClone, which inside Books only copy BookId and BookName remain is empty. Just like below

{
  "Id": 0,
  "Total": 3,
  "Books": [
    {
      "BookId": 1,
      "BookName": "Book A",
      "Publisher": "",
      "ISBNCode": "",
      "Catagories": []
    },
    {
      "BookId": 2,
      "BookName": "Book B",
      "Publisher": "",
      "ISBNCode": "",
      "Catagories": []
    },
    {
      "BookId": 3,
      "BookName": "Book C",
      "Publisher": "",
      "ISBNCode": "",
      "Catagories": []
    }
  ]
}

Event the original result have value of Publisher, ISBNCode ..etc How to do it in LINQ ?

My second question is , if I want to make a fluent assertions as above object

var result = await sut.search(query);
result.Should().BeEquivalentTo ({the SearchResultClone }) 

How to write this fluent assertion ?


Solution

  • You need to create new instances of the classes based on the old instances:

    var ans = result.Select(sr => new SearchResult {
        Id = sr.Id,
        Total = sr.Total,
        Books = sr.Books.Select(b => new Book { BookId = b.BookId, BookName = b.BookName }).ToList()
    }).ToList();