Mock a Guid with Moq

本文关键字:Moq with Guid Mock | 更新日期: 2023-09-27 18:01:14

我正在使用Moq进行单元测试。我想模仿Guid。我发现了这篇关于嘲笑Guid.NewGuid()的帖子,但我不知道它是否适用于我,因为我不知道(也找不到(mockGuidService是什么类型

您可以实现一个带有接口的包装器类,如下所示。

public interface IGuidService { Guid NewGuid(); }
class GuidService : IGuidService
{
    public Guid NewGuid() { return Guid.NewGuid(); }
}

您必须添加依赖项注入才能将其引入到您的类中。在您正在测试的类中,添加包装器的实例并在构造函数中分配它。

class MyClass {
    private IGuidService myGuidService;
    public MyClass() { myGuidService = new GuidService(); }
    public MyClass(IGuidService gw) { myGuidService = gw; }
    public void DoSomethingThatRequiresAGuid() {
        myGuidService.NewGuid();
    }
}

然后在你的测试中,你会这样做:

var mockGuidService = new Mock<IGuidService>();
mockGuidService.Setup(x => x.NewGuid()).Returns( [a Guid of your choice] );
new MyClass(mockGuidService.Object);

Mock a Guid with Moq

mockGuidService的类型是Mock<IGuidService>。只有当您使用GUID提供服务的接口并且能够注入mock时,它才会起作用。

如果您的体系结构过于紧密地耦合而无法做到这一点(没有接口,没有DI(,那么我建议对其进行改进,但如果您无法更改它,那么还有其他选择。您可以提取生成GUID作为方法,将其标记为虚拟,并创建整个对象的mock,在其中更改方法的行为。