Csharp/C#教程:使用FakeItEasy在方法中模拟方法分享


使用FakeItEasy在方法中模拟方法

如何从另一个函数中调用的函数模拟/解析结果? 通常,Test2将是一个DataAccess方法,我不想获取真实数据。 我喜欢我测试的unit testing是业务逻辑。

这就是我现在拥有的,但它根本不起作用。 Sum总是断言为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! } 

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

 [TestMethod()] public void TestToTest() { //Arrange var instance = A.Fake(); //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); } 

首先,我想说,我认为Tseng的答案中有很多重点,特别是关于如何

  1. 伪造接口意味着永远不能调用“内部方法”
  2. 你应该假装依赖,而不是内部。 如果您可以选择进行此更改,请执行此操作,并立即停止阅读我的答案。

如果你还在读书,我会对两件事情感到困惑:

  1. Test1应该返回businessLogic吗? 正如它的编写(一旦编译错误得到修复),当Test2返回5时,我希望Test1返回5(而不是15)。
  2. TestToTest ,当您在Test2上设置Returns(5) ,然后调用Test1 ,由于您伪造了一个接口,我希望sum为0,这是int的默认值。 我不确定你是怎么得到的5.事实上,我在这个测试中复制了这种行为:

 [TestMethod] public void TestToTestInterface() { //Arrange var instance = A.Fake(); //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(0, sum); // because Test1 wasn't faked } 

虽然我自己并不关心这种方法,但如果你真的想在ClassWithMethods可替换的代码,然后测试Test1方法,那么有一种方法:

  1. 我们需要使Test1Test2 virtual ,否则它们不会是假的。
  2. 伪造ClassWithMethods ,而不是IClasssWithMethods
  3. 告诉假人,当调用Test1时,它应该调用原始代码(它将依次调用假的Test2 )。

我把这些改变放在一起,这个测试通过我:

 public class ClassWithMethods : IClassWithMethods { public virtual int Test1() { var value = this.Test2(); //Unittest should substitute with 5 var businesslogic = value + 10; //The business logic return businesslogic; } public virtual int Test2() { return 10; //I try to mock this value away in the test. Don´t go here! } } [TestMethod] public void TestToTestClass() { //Arrange var instance = A.Fake(); //Make calling Test2 return 5 and not 10. A.CallTo(() => instance.Test2()).Returns(5); // Make sure that Test1 on our fake calls the original ClassWithMethods.Test1 A.CallTo(() => instance.Test1()).CallsBaseMethod(); //Call the method var sum = instance.Test1(); //Assert if the business logic in the method works. Assert.AreEqual(15, sum); } 

据我所知,你做不到这一点。

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

但你可以做的是做2unit testing。

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

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

模型仅用于必须在接口上进行模拟的依赖项(在您测试的类之外实例化)。 即如果你有ClassAClassBClassA依赖于IClassB接口。 然后你可以模拟B来测试A.

上述就是C#学习教程:使用FakeItEasy在方法中模拟方法分享的全部内容,如果对大家有所用处且需要了解更多关于C#学习教程,希望大家多多关注—计算机技术网(www.ctvol.com)!

本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

ctvol管理联系方式QQ:251552304

本文章地址:https://www.ctvol.com/cdevelopment/952264.html

(0)
上一篇 2021年11月19日
下一篇 2021年11月19日

精彩推荐