最小起订量中的抽象工厂单元测试

Abstract Factory Unit Testing In Moq

假设我有以下 class 定义为 SomeClass

public SomeClass
{
    private IThingFactory _thingFactory;

    public SomeClass(IThingFactory thingFactory)
    {
        _thingFactory = thingFactory;
    }

    public IThing CreateThing(int a, int b, string c)
    {
        IThing thing = _thingFactory.MakeEmptyThing();
        thing.MakeFromFields(a, b, c);

        return thing;
    }
}

CreateThing(int a, int b, string c) 方法的规范是它接受一个整数 a、整数 b、字符串 c 和 returns 一个 IThing 具有相应的属性。 (所以内部可能 new Thing(a, b, c)

然而,工作于 IThingFactoryThing 的实现委托会自行填充。

所以现在我正在尝试对方法 CreateThing() 进行单元测试,但我不确定它应该如何工作。

这是我尝试过的:

基于模拟依赖的原则,我创建了一个 Mock<IThingFactory> 并将其交给 SomeClass

的构造函数
_mockThingFactory = new Mock<IThingFactory>();
someClass = new SomeClass(_mockThingFactory.Object);

后来我调用了测试中的方法

IThing thing = _someClass.CreateThing(It.IsAny<int>(), 
    It.IsAny<int>(), 
    It.IsAny<string>>());

并断言,我不确定。我应该验证 MakeEmptyThing() 被调用了吗? thing.MakeFromFields(a, b, c); 有什么用?

您应该查看被测方法的结果。在这种情况下,结果是 "factory constructed object and particular method of the object is called with arguments".

测试您是否可以 return 来自 CreateThing 的模拟对象,然后检查 MakeFromFields 是否使用预期参数调用它(即 Using Moq, How to setup a method call with an input parameter as an object with expected property values?)。

var mockThing = new Mock<IThing>();
_mockThingFactory.Setup(f=> f.MakeEmptyThing()).Returns(mockThing.Object);

classUnderTest =  new SomeClass(_mockThingFactory.Object);  
classUnderTest.CreateThing(1,2,3);
mockThing.Verify(....)

请注意,将MakeFromFields移至工厂可能会更好。还可以考虑使用现有的 DI 框架(如 Unity)来处理所有对象创建。