我想对测试一个类的不同选项有一些见解,该类有责任在Sample
给定两个其他对象的情况下创建一个对象。
我的对象的 API 如下:
public interface ISampleCreator
{
Sample CreateSample(Order order, SampleService sampleService);
}
该方法中的逻辑可以分为三个部分:
Sample
为( 取决于Order
和)初始化一些简单的属性SampleService
。Sample
为(取决于Order.Samples
和)设置一个新的唯一名称SampleService
。Sample
为(取决于)设置一些附加字段SampleService
。
我的问题是,如果我想彻底测试该方法,我有很多不同的情况需要考虑一些复杂的设置。
我的第一个想法是提取一个类以生成点 2- 的唯一名称,并提取一个类以生成示例的附加字段。
然后我可以独立测试这两个类,并且可以模拟它们以减少对该CreateSample
方法的测试。例如:
[TestMethod]
public void CreateSampleTest()
{
Order order = new Order();
SampleService sampleService = new SampleService();
Mock<ISampleNameGenerator> mockNameGenerator = new Mock<ISampleNameGenerator>();
mockNameGenerator.Setup(x => x.GenerateSampleName(order.Samples, sampleService))
.Returns("Generated name");
Mock<ISampleFieldsCreator> mockFieldsCreator = new Mock<ISampleFieldsCreator>();
List<SampleField> sampleFields = new List<SampleField>();
mockFieldsCreator.Setup(x => x.CreateFieldsForNewSample(sampleService))
.Returns(sampleFields);
SampleCreator sampleCreator = new SampleCreator(mockNameGenerator.Object, mockFieldsCreator.Object);
Sample sample = sampleCreator.CreateSample(order, sampleService);
Assert.AreEqual("Generated name", sample.Name);
Assert.AreEqual(sampleFields, sample.Fields);
Assert.AreEqual(order, sample.Order);
Assert.AreEqual(sampleService, sample.SampleService);
}
这种方法的问题是我正在模拟我拥有的类并且不访问任何外部资源:基本上,我正在做基于模拟的测试,以简化我的测试设置。
您如何看待这种方法?
您能否提出其他替代方案以及您为什么要这样做?