Net Framework Xuit与Moq单元测试保持调用原始函数



我在mocking方面遇到了问题,因为它一直在调用原始函数。这是我的演示代码

第一个文件是包含我想要模拟的函数的接口。

public interface IDemoReplace
{
int FunctionToBeReplaced();
}

第二个文件是一个类,它实际上实现了函数

public class DemoReplace : IDemoReplace
{
public int FunctionToBeReplaced()
{
//this function contains sql query in my real project
return 1;
}
}

第三个文件是我想测试的类

public class ClassToBeTested
{
public int TestThisFunction()
{
IDemoReplace replace = new DemoReplace();
var temp = replace.FunctionToBeReplaced();
return temp;
}
}

最后一个文件是测试类

public class TestClass
{
[Fact]
public void TryTest()
{
using (var mock = AutoMock.GetLoose()) {
//Arrange
mock.Mock<IDemoReplace>()
.Setup(x => x.FunctionToBeReplaced())
.Returns(returnTwo());
var classToBeTested = mock.Create<ClassToBeTested>();
var expected = 2;
//Act
var actual = classToBeTested.TestThisFunction();
//Assert
Assert.Equal(expected, actual);
}
}
public int returnTwo() {
return 2;
}
}

此测试将失败,预期值为2,实际值为1。当我尝试调试时,它不调用returnTwo,而是调用原始函数。

我是单元测试的新手,所以我错过了什么?请注意,上面的代码只是我实际项目中发生的事情的演示。FunctionToBeReplaced实际上是一个执行并返回数据库记录的函数,所以我想模拟这个函数。

谢谢:(

这是一个设计问题。受测试的主体与实现问题紧密耦合,这使得很难隔离主体以便对其进行单元测试。

它(主题(正在手动创建其依赖

IDemoReplace replace = new DemoReplace();

理想情况下,您希望显式注入依赖项。这些依赖关系也应该是抽象的,而不是具体的。

public class ClassToBeTested {
private readonly IDemoReplace dependency;
public ClassToBeTested(IDemoReplace dependency) {
this.dependency = dependency;
}
public int TestThisFunction() {            ;
var temp = dependency.FunctionToBeReplaced();
return temp;
}
}

在运行时,可以纯注入实现(或mock(,也可以通过容器注入。

显示的原始示例中的测试现在应该如预期的那样运行。

public class TestClass {
[Fact]
public void TryTest() {
using (var mock = AutoMock.GetLoose()) {
//Arrange
var expected = returnTwo();
mock.Mock<IDemoReplace>()
.Setup(x => x.FunctionToBeReplaced())
.Returns(expected);
var classToBeTested = mock.Create<ClassToBeTested>();
//Act
var actual = classToBeTested.TestThisFunction();
//Assert
Assert.Equal(expected, actual);
}
}
public int returnTwo() {
return 2;
}
}

最新更新