假设我定义了以下名为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)
)
但是,实现会将工作委托给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);
?
答案 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)来处理所有对象创建。