c# – 如何编写nUnit / Moq来测试通用扩展方法?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了c# – 如何编写nUnit / Moq来测试通用扩展方法?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含1678字,纯文字阅读大概需要3分钟。
内容图文
我有以下通用扩展方法从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));
}
}
现在,假设所有模拟类型(上下文和对象集)都将您调用的方法声明为虚拟或类是抽象的.模拟接口通常限制性较小.
此外,如果您希望对断言更加挑剔,以确保首先使用第一个实例调用DeleteObject,然后使用第二个实例调用DeleteObject,而不是第一个实例,则可以更改测试的该部分.但这应该是一个很好的起点.
总结一下:
此特定测试应该只测试扩展方法中的代码.这意味着,它应该只确保您调用CreateObjectSet<>(),获取列表,然后在每个上调用DeleteObject.
它确实不在乎DeleteObject()确实改变了ObjectSet(事实上它不会,因为它是一个模拟).这应该是DeleteObject()方法测试的责任,但由于我假设这实际上是一个EF方法,所以不应该为第三方组件编写测试.
内容总结
以上是互联网集市为您收集整理的c# – 如何编写nUnit / Moq来测试通用扩展方法?全部内容,希望文章能够帮你解决c# – 如何编写nUnit / Moq来测试通用扩展方法?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。