【发布时间】:2015-09-30 09:57:12
【问题描述】:
在比较动态集合(ViewBag)中的两个对象时,我在使用 xUnit.net 时遇到了一个相当奇怪的问题。
我有一个带有以下方法的 ActionFilter:
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;
}
注意这些值是如何包装在 List<SelectListItem> 中的,然后分配给 ViewBag。
然后我有一个测试,测试我的存储库中的值是否添加到 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
}
这个测试失败了
结果消息:
Assert.Equal() 失败预期:列表 [SelectListItem { Disabled = False, Group = null, Selected = False, Text = "Foo", Value = "Bar" }]
实际:列表 [SelectListItem { Disabled = False, Group = null, Selected = False, Text = "Foo", Value = "Bar" }]
在我看来,这看起来是一样的。
以防万一我测试它是否意外检查它是否是同一个实例。但以下通过。所以事实并非如此。
var a = new {a = "a"};
var b = new {a = "a"};
Assert.Equal(a, b); // pass
【问题讨论】:
-
嗨,我会尝试实现,IEquatable
接口:msdn.microsoft.com/en-us/library/ms131187.aspx for you class "SelectListItem" 以确保 Equal 以您需要的方式工作。 -
匿名类型的 Equals 方法被重写以实现结构相等,这就是你最后一次测试通过的原因。
-
Assert.Contains 轻微相关:stackoverflow.com/questions/16716161/…
标签: c# asp.net equality viewbag xunit.net