最小起订量中的抽象工厂单元测试
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)
)
然而,工作于 IThingFactory
和 Thing
的实现委托会自行填充。
所以现在我正在尝试对方法 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)来处理所有对象创建。
假设我有以下 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)
)
然而,工作于 IThingFactory
和 Thing
的实现委托会自行填充。
所以现在我正在尝试对方法 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)来处理所有对象创建。