如何解决如何从工厂调用方法的最小起订量
在 Startup 中,我定义了一个工厂,类似于 How to register multiple implementations of the same interface in Asp.Net Core?
接口有 1 个方法 Process 如下。
//saves to db.
public interface Iprocessor
{
void Process(List<items>);
}
在 Startup.cs 中注册工厂的代码
Func<string,IProcessor> accessor = key =>
{
switch(key){
case "new":
return factory.GetService<NewProcessor>();
case "old":
return factory.GetService<OldProcessor>();
}
}
我的服务类使用这个工厂,我需要帮助来模拟它。
private readonly Func<string,Iprocessor> _processor;
_processor 是使用 DI 分配的。
public void ProcessRecords(List<items> items){
List<string> types = new List<string> () { "new","old"};
foreach(var type in types)
{
var processor = _processor(type);
if(processor != null)
{
_processor.Process(items);
}
}
}
如何模拟 Process 方法调用?
解决方法
为了确保一切正常,您需要分别测试每个组件。首先,您必须确保您的 OldProcessor
和 NewProcessor
按预期工作。
之后您可以专注于ProcessRecords
。
如果我可以假设您的服务类在其构造函数中接收工厂委托:
class SUT
{
private readonly Func<string,Iprocessor> _processor;
public SUT(Func<string,Iprocessor> processor)
{
this._processor = processor;
}
public void ProcessRecords(List<items> items)
{
...
}
}
那么在你的情况下,你需要做的就是创建 Iprocessor
模拟
并提供一个始终解析此模拟的委托:
[Fact]
public void TestMethod1()
{
//Arrange
var processorMock = new Mock<Iprocessor>();
Func<string,Iprocessor> factory = _ => processorMock.Object;
var input = new List<items> { ... };
//Act
var sut = new SUT(factory);
sut.ProcessRecords(input);
//Assert
processorMock.Verify(processor => processor.Process(input),Times.Exactly(2));
}
然后您可以验证 Process
方法已被调用两次。
或者,如果您愿意,可以创建两个单独的模拟:
[Fact]
public void TestMethod2()
{
//Arrange
var oldProcessorMock = new Mock<Iprocessor>();
var newProcessorMock = new Mock<Iprocessor>();
Func<string,Iprocessor> factory =
t => t == "new"
? newProcessorMock.Object
: oldProcessorMock.Objet;
var input = new List<items> { ... };
//Act
var sut = new SUT(factory);
sut.ProcessRecords(input);
//Assert
oldProcessorMock.Verify(processor => processor.Process(input),Times.Once);
newProcessorMock.Verify(processor => processor.Process(input),Times.Once);
}
更新:设置Process
方法
oldProcessorMock
.Setup(processor => processor.Process(It.IsAny<List<items>>())
.Verifiable();
newProcessorMock
.Setup(processor => processor.Process(It.IsAny<List<items>>())
.Verifiable();
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。