c# - 如何最小量从工厂调用方法
问题描述
在 Startup 中,我定义了一个工厂,类似于 如何在 Asp.Net Core 中注册同一接口的多个实现?
接口有1个方法流程如下。
//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
.
如果我可以假设您的服务类在其 ctor 中接收工厂委托:
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();
推荐阅读
- vue.js - Onclick 功能在自定义图例图表 vue 中不起作用
- delta-lake - 如何更新 Delta 中分区列的值?
- asp.net-mvc - 没有 GetAwaiter 的定义(Razor,MVC)
- x86 - 多级分页中页表遍历的详细信息
- c++ - 仅在按 enter 时显示输出
- php - 返回一个 xml 文件,避免回显它
- php - 如何解决在执行“composer install”时找不到受支持的加密?
- amazon-web-services - 使用部署脚本时出现 AWS 身份验证问题
- kubernetes - 修改 pod 映像时,Replicaset 不会更新 pod
- c++ - 红帽:使用
编译正常但链接器找不到 __atomic_store_16; 什么图书馆?