如何模拟 ObservableCollection

Jus*_*ony 3 c# unit-testing moq mocking observablecollection

我有以下几点:

class foo : ObservableCollection<Int32>
{
  //Stuff
}


[Test]
public void test()
{
  var foo = Mock.Of<foo>();
  int count = 0;
  Mock.Get(foo).Setup(x => x.Add(It.IsAny<Int32>())).Callback(() => count++);
  Mock.Get(foo).Setup(x => x.Count).Returns(() => count);
  //Do Stuff
}
Run Code Online (Sandbox Code Playgroud)

然而,AddCount特别是indexer[]不覆写投放。我唯一的办法AddfooAdd在我的 foo 类中创建该调用等吗?

Ser*_*kiy 5

我不认为你应该嘲笑等基本类型为ListObservableCollectionDateTime(即使它是可能的)。它们是可靠的,不太可能改变。只需ObservableCollection在您的测试中使用,而不是尝试重新实现它的计数增加功能。您始终可以进行基于状态的验证:

var items = new ObservableCollection<int>();
// Do stuff
Assert.That(items.Count, Is.EqualTo(5));
Run Code Online (Sandbox Code Playgroud)

如果您使用Foo继承自的自定义类型,ObservableCollection<Int32>您还可以实现一些IFoo易于模拟的接口:

public class Foo : ObservableCollection<Int32>, IFoo
Run Code Online (Sandbox Code Playgroud)

  • 由于 foo 中有功能,我们只需在模拟上设置`CallBase = true`。所以,我们不必担心覆盖 Add、Count 等。但是,可以覆盖自定义的东西 (2认同)