Maison >développement back-end >C++ >Comment simuler efficacement les méthodes d'extension à l'aide de Moq ?
Méthodes d'extension moqueuses avec Moq : un guide complet
Tester du code qui repose sur des méthodes d'extension peut poser des défis uniques, surtout si vous souhaitez vous assurer que les échecs futurs de ces méthodes d'extension n'affecteront pas vos tests. Bien que Moq ne prenne pas directement en charge le remplacement des méthodes statiques (telles que celles utilisées dans les méthodes d'extension), il existe une solution de contournement astucieuse pour réaliser une simulation dans cette situation.
Contrairement aux méthodes d'instance, les méthodes statiques ne peuvent pas être remplacées ou masquées. La fonctionnalité principale de Moq est de créer des instances fictives d'objets, ce qui exclut essentiellement le ciblage de méthodes statiques.
L'astuce pour se moquer des méthodes d'extension est de se rendre compte qu'il ne s'agit essentiellement que de méthodes statiques déguisées en méthodes d'instance. Pour ce faire, nous avons besoin de :
Voici un exemple de la façon dont cela fonctionne :
<code class="language-csharp">// 在实用程序类中定义扩展方法 public static class Utility { public static SomeType GetFirstWithId(this List<SomeType> list, int id) { return list.FirstOrDefault(st => st.Id == id); } } // 创建实用程序类的模拟实例 var mockUtility = new Mock<Utility>(); // 配置模拟以返回我们想要的结果 mockUtility.Setup(u => u.GetFirstWithId(It.IsAny<List<SomeType>>(), 5)).Returns(new SomeType { Id = 5 }); // 设置测试 var listMock = new Mock<List<SomeType>>(); listMock.Setup(l => l.Count).Returns(0); // 此示例中列表中没有实际项目 // 测试的断言 Assert.That(listMock.Object.GetFirstWithId(5), Is.Not.Null);</code>
En déplaçant les méthodes d'extension dans une classe utilitaire statique et en nous moquant de la classe elle-même, nous surmontons efficacement la limitation de l'impossibilité de remplacer directement les méthodes d'extension statiques. Cette solution de contournement garantit que vos tests restent robustes même en cas d'échec des futures méthodes d'extension.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!