I've run into a rather odd problem with xUnit.net when comparing two objects in a dynamic collection (the ViewBag).
I have an ActionFilter with the following method:
public void OnActionExecuting(ActionExecutingContext filterContext)
{
var selectList = new List<SelectListItem>();
var foos = _repo.Get();
foreach (var foo in foos)
{
var selectItem = new SelectListItem()
{
Text = foo.Text,
Value = foo.Value
};
selectList.Add(selectItem);
}
filterContext.Controller.ViewBag.SelectList = selectList;
}
Note how the values are wrapped in a List<SelectListItem>
and then assigned to the ViewBag
.
Then I have a test which tests if the values from my repository are added to the ViewBag:
public void MyTest()
{
// Arrange
var fakeController = Substitute.For<Controller>();
var fakeContext = Substitute.For<ActionExecutingContext>();
fakeContext.Controller = fakeController;
var repository = Substitute.For<IRepository<Foo>>();
var foo = new Foo() {Text = "Foo", Value = "Bar"};
var foos = new List<Foo> { foo };
repository.Get().Returns(foos);
var filter = new MyFilter(repository);
// Act
filter.OnActionExecuting(fakeContext);
// Assert
var expected = new List<SelectListItem> {new SelectListItem {Text = foo.Text, Value = foo.Value}};
Assert.Equal(expected, fakeContext.Controller.ViewBag.SelectList); // fails
}
This test fails with
Result Message:
Assert.Equal() FailureExpected: List [SelectListItem { Disabled = False, Group = null, Selected = False, Text = "Foo", Value = "Bar" }]
Actual: List [SelectListItem { Disabled = False, Group = null, Selected = False, Text = "Foo", Value = "Bar" }]
To me that looks equal.
Just in case I tested if it was unexpectedly checking for if it was the same instance. But the below passes. So that's not the case.
var a = new {a = "a"};
var b = new {a = "a"};
Assert.Equal(a, b); // pass