c# - xUnit 测试:如何模拟工厂?
问题描述
我有以下两个类ClassA
和ClassB
.
专注于:ClassB
实现一个工厂ClassA
。
我想测试ClassB
。那么我如何(或者你会)模拟一个工厂ClassA
,ClassB
以便实例化一个模拟ClassA
并访问它的模拟函数.ReturnString()
?
public class ClassA : IClassA
{
readonly int _number;
public ClassA(int number)
{
_number = number;
}
public string ReturnString()
{
return _number.ToString();
}
}
public class ClassB : IClassB
{
int _exampleValue;
readonly Func<int, IClassA> _classAFactory;
public ClassB(Func<int, IClassA> classAFactory)
{
_classAFactory = classAFactory;
}
public string ExampleFct()
{
_exampleValue = 5;
IClassA classA = _classAFactory(_exampleValue)
return classA.ReturnString();
}
}
public class TestClassB
{
[Fact]
public void TestClassBReturnsCorrectString()
{
// Arrange
var mockClassAFact = ???
IClassB classB = new ClassB(mockClassAFact);
// Act
string aString = classB.ExampleFct();
// Assert
Assert.True(aString == "5");
}
}
当我使用“Autofac”作为 IoC 的基础时,可能有一个特定的解决方案?
感谢您的任何帮助!
解决方案
根据需要模拟依赖项(接口)并在安排测试时为“工厂”创建一个委托
[Fact]
public void TestClassBReturnsCorrectString() {
// Arrange
string expected = "5"
IClassA mockClassA = Mock.Of<IClassA>(_ => _.ReturnString() == expected);
int value = 5;
Func<int, IClassA> mockClassAFact =
number => number == value ? mockClassA : throw new InvalidArgumentException();
IClassB subject = new ClassB(mockClassAFact);
// Act
string actual = subject.ExampleFct();
// Assert
Assert.True(actual == expected);
}
注意:上面的示例使用 MOQ 来模拟IClassA
依赖项并创建一个工厂委托以用于执行测试。
在这种情况下,“Autofac”是一个实现细节,与这个独立的单元测试没有实际关系。
推荐阅读
- spring-boot - Spring-boot:原型范围bean:如何检查具有相同值的bean是否已经存在?
- javascript - 如何在 React 的 UseEffect() 中调用异步函数?
- vba - VBA 中的 Windows 键盘挂钩 API 导致 PowerPoint 中的无限循环
- python - AWS Lambda,Python:获取具有启动时间的实例以进行排序语法错误,比较标签时出错
- java - 来自覆盆子的 jaydebeapi 的问题类路径
- javascript - NativeScript Http模块getscript返回并将响应分配给变量
- code-coverage - OpenCover 是否并行运行测试?有没有不可以的选项?
- python - 无法使用 patool 包提取 gz 文件
- r - 如何计算R中不同类别之间的重叠
- python - 使用 Numpy 缓解浮点逼近问题