我正在使用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);
mockGuidService
的类型是Mock<IGuidService>
。只有当您使用GUID提供服务的接口并且能够注入mock时,它才会起作用。
如果您的体系结构过于紧密地耦合而无法做到这一点(没有接口,没有DI(,那么我建议对其进行改进,但如果您无法更改它,那么还有其他选择。您可以提取生成GUID作为方法,将其标记为虚拟,并创建整个对象的mock,在其中更改方法的行为。