使用 FakeItEasy 在方法中模拟方法

Stu*_*rla 4 c# unit-testing fakeiteasy

如何模拟/伪造另一个函数中调用的函数的结果?通常 Test2 将是一种我不喜欢获取真实数据的 DataAccess 方法。我喜欢我的单元测试测试的是业务逻辑。

这就是我现在所拥有的,但它根本不起作用。总和始终断言为 5!

public int Test1()
{
    var value = this.Test2(); //Unittest should substitute with 5
    var businesslogic = value + 10; //The business logic

    return businesslogic;
}

public int Test2()
{
    return 10; //I try to mock this value away in the test. Don´t go here!
}
Run Code Online (Sandbox Code Playgroud)

然后我有一个单元测试,我想在我的“业务逻辑”上运行。

[TestMethod()]
public void TestToTest()
{
//Arrange
var instance = A.Fake<IClassWithMethods>();

      //Make calling Test2 return 5 and not 10.
A.CallTo(() => instance.Test2()).Returns(5);

      //Call the method 
var sum = instance.Test1();

//Assert if the business logic in the method works.
Assert.AreEqual(15, sum);
}
Run Code Online (Sandbox Code Playgroud)

Tse*_*eng 5

据我所知,你不能这样做。

instance不是真实类的实例,只是它接口上的一个模型,因此调用instance.Test1()不会调用您上面描述的代码。但是,您可以Test2自行使用UnitTest方法。

但是,您可以做的是,进行 2 个单元测试。

在第一个测试(测试方法Test2)中,您使用必要的依赖项(或者如果没有具有某些值/参数的依赖项)实例化您的类。

然后使用相同的输入参数和测试Test()方法进行第二次测试。

Mockups 仅用于依赖项,您必须在接口上进行模拟(在您测试的类之外实例化)。也就是说,如果你有ClassAClassBClassA取决于IClassB接口。然后你可以模拟B来测试A。