我希望这有助于:
[TestFixture]
public class ExtensionTest
{
public class FakeEntity : EntityObject
{
}
[Test]
public void DeleteAllObjects()
{
//arrange
var objectsToDelete = new List<FakeEntity>
{
new FakeEntity(),
new FakeEntity()
};
var mockContext = new Mock<ObjectContext>();
var mockObjectSet = new Mock<ObjectSet<FakeEntity>>();
mockObjectSet.Setup(x => x.ToList()).Returns(objectsToDelete);
mockContext.Setup(x => x.CreateObjectSet<FakeEntity>()).Returns(mockObjectSet.Object);
//act
mockContext.Object.DeleteAllObjects<FakeEntity>();
//assert
mockContext.Verify(x => x.CreateObjectSet<FakeEntity>(), Times.Once());
mockObjectSet.Verify(x => x.ToList(), Times.Once());
mockObjectSet.Verify(x => x.DeleteObject(It.IsAny<FakeEntity>()), Times.Exactly(2));
}
}
现在,这是假设所有的嘲笑类型(上下文和对象设置)有你调用声明为virtual
的方法或类abstract
。模拟接口通常限制性较小。另外,如果你想要得到更多挑剔与你的断言,以确保确实DeleteObject
首先与第一个实例,然后与第二个,而不是第一个两次,然后你可以改变那部分测试。但这应该是一个很好的起点。
总结:
这个特殊的测试应您的扩展方法中唯一真正测试代码。意思是,它应该只确保你打电话CreateObjectSet<>()
,得到清单,然后每个电话打DeleteObject
。
它应该根本不在乎DeleteObject()
是否改变了ObjectSet
(事实上它不会,因为它是一个模拟)。这应该是DeleteObject()
方法测试的责任,但是由于我假设这实际上是EF方法,因此您不应该为第三方组件编写测试。
我想你已经先创建[TestFixtureSetup]创建上下文对象,以objectsets的预定数量。然后在这个函数调用后,你可以断言objectset.count为0.希望这会有所帮助。 – Mullaly