抽象工厂单元测试在Moq

时间:2015-09-02 16:54:37

标签: c# unit-testing moq

假设我定义了以下名为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)方法的规范是它采用int a,int b,字符串c并返回带有相应属性的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);

1 个答案:

答案 0 :(得分:0)

您应该查看测试方法的结果。在这种情况下,结果是&#34;工厂构造的对象和对象的特定方法用参数调用&#34;。

要测试您是否可以从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)来处理所有对象创建。