xUnit测试:如何模拟工厂?



我有以下两个类ClassAClassB

重点讨论: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"在这种情况下,是一个与这个独立单元测试没有实际关系的实现细节。

相关内容

  • 没有找到相关文章

最新更新