【问题标题】:Abstract Factory Unit Testing In MoqMoq 中的抽象工厂单元测试
【发布时间】:2015-09-02 16:54:36
【问题描述】:

假设我有如下定义的名为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, string c 并返回一个带有相应属性的 IThing。 (所以内部可能是new Thing(a, b, c)

但是,工作委托给 IThingFactoryThing 的实现会自行填充。

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

这是我尝试过的:

基于mock依赖的原则,我创建了一个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);

【问题讨论】:

    标签: c# unit-testing moq


    【解决方案1】:

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

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

    【讨论】:

    • 这是否意味着我也必须模拟MakeFromFields()
    • @Rhs 我认为您不需要模拟 MakeFromFields 它。只要确保它被调用,如链接的帖子所示。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多