gpt4 book ai didi

c# - 如何编写 nUnit/Moq 来测试通用扩展方法?

转载 作者:太空狗 更新时间:2023-10-30 01:06:54 24 4
gpt4 key购买 nike

我有以下用于从 ObjectContext 中删除所有 EntityObjects 的通用扩展方法

public static void DeleleAllObjects<TEntity>(this ObjectContext context)
where TEntity : EntityObject
{
var objectSet = context.CreateObjectSet<TEntity>();
objectSet.ToList().ForEach(e => objectSet.DeleteObject(e));
}

我对 TDD 和使用 nUnit/Moq 还很陌生...但我不确定要在哪里为这种方法编写测试?

最佳答案

希望对您有所帮助:

[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或者类(class)是 abstract .模拟接口(interface)通常限制较少。

此外,如果您想对自己的断言更加挑剔,以确保确实 DeleteObject首先调用第一个实例,然后调用第二个实例,而不是在第一个实例中调用两次,然后您可以更改测试的那部分。但这应该是一个很好的起点。

总结:

这个特定的测试应该只真正测试你的扩展方法中的代码。意思是,它应该只确保您调用 CreateObjectSet<>() ,获取列表,然后调用 DeleteObject在每一个上。

它根本不应该关心是否确实是 DeleteObject()改变了 ObjectSet或不(实际上它不会,因为它是一个模拟)。这应该是对 DeleteObject() 的测试的责任。方法,但由于我假设这实际上是一个 EF 方法,所以您不应该为第三方组件编写测试。

关于c# - 如何编写 nUnit/Moq 来测试通用扩展方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13966641/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com