Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/.net/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何使用Moq框架模拟一个简单的方法?_C#_.net_Unit Testing_Mocking_Moq - Fatal编程技术网

C# 如何使用Moq框架模拟一个简单的方法?

C# 如何使用Moq框架模拟一个简单的方法?,c#,.net,unit-testing,mocking,moq,C#,.net,Unit Testing,Mocking,Moq,假设我有一个简单的方法来检查传递的数字是否为偶数&返回一个布尔值。我不太会嘲笑和尝试。如何使用Moq框架模拟此方法 public bool isEven(int x) { bool result = (x % 2 == 0) ? true : false; return result; } 假设该方法是接口的一部分: public interface IMyInterface { bool isEven(in

假设我有一个简单的方法来检查传递的数字是否为偶数&返回一个布尔值。我不太会嘲笑和尝试。如何使用Moq框架模拟此方法

public bool isEven(int x)
        {
            bool result = (x % 2 == 0) ? true : false;
            return result;
        }

假设该方法是接口的一部分:

public interface IMyInterface
{
   bool isEven(int x);
}
你嘲笑它的方式是:

Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
Mock<MyClass> myMock = new Mock<MyClass>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var myNewObject = new Whateverclass(myMock.Object)
如果您的方法存在于具体的类中,您仍然可以这样做,但是您需要将您的方法标记为虚拟的。过程的其余部分完全相同

Moq在其下面所做的是创建自己的类(如proxy)的实例,并为members方法(已在setup方法中配置的属性)输入返回值

编辑: 具体例子:

public class MyClass
{
   public virtual bool isEven(int x) {
     return (x % 2 == 0);
   }
}
你嘲笑它的方式是:

Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
Mock<MyClass> myMock = new Mock<MyClass>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var myNewObject = new Whateverclass(myMock.Object)
最后,部分实施:

public class MyClass
{
   public virtual bool isEven(int x) {
         return (x % 2 == 0);
       }
   public bool OtherMethod() {
       return !isEven();
   }
}

Mock<MyClass> myMock = new Mock<MyClass>();
myMock.CallBase = true;
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var result = myMock.Object.OtherMethod();

假设该方法是接口的一部分:

public interface IMyInterface
{
   bool isEven(int x);
}
你嘲笑它的方式是:

Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
Mock<MyClass> myMock = new Mock<MyClass>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var myNewObject = new Whateverclass(myMock.Object)
如果您的方法存在于具体的类中,您仍然可以这样做,但是您需要将您的方法标记为虚拟的。过程的其余部分完全相同

Moq在其下面所做的是创建自己的类(如proxy)的实例,并为members方法(已在setup方法中配置的属性)输入返回值

编辑: 具体例子:

public class MyClass
{
   public virtual bool isEven(int x) {
     return (x % 2 == 0);
   }
}
你嘲笑它的方式是:

Mock<IMyInterface> myMock = new Mock<IMyInterface>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);
Mock<MyClass> myMock = new Mock<MyClass>();
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var myNewObject = new Whateverclass(myMock.Object)
最后,部分实施:

public class MyClass
{
   public virtual bool isEven(int x) {
         return (x % 2 == 0);
       }
   public bool OtherMethod() {
       return !isEven();
   }
}

Mock<MyClass> myMock = new Mock<MyClass>();
myMock.CallBase = true;
myMock.Setup(x => x.isEven(It.Any<int>())).Returns(true);

var result = myMock.Object.OtherMethod();

在另一个侧注上,一个简单的“return x%2==0”将出现在另一个侧注上,方法名称令人困惑,这意味着如果数字是偶数或奇数,该方法将返回true。我给这样的方法命名,比如ISeven您是否使用依赖项注入将包含此方法的类的实例注入到调用它的对象中?调用此方法的是什么以及您尝试测试的是什么?请将您的方法标记为虚拟。在一个侧注上可能存在重复的,一个简单的“return x%2==0”将出现在另一个侧注上,方法名称令人困惑,这意味着如果数字是偶数或奇数,则该方法将返回true。我给这样的方法命名,比如ISeven您是否使用依赖项注入将包含此方法的类的实例注入到调用它的对象中?调用此方法的是什么以及您试图测试的是什么?将您的方法标记为虚拟方法。因此,模拟时必须使用接口,否则可能会重复此方法。不过,这是最常用的做法。看看答案的第二部分,你也可以做所谓的部分模拟,你可以只模拟一个方法而不是所有方法。视需要而定,但过程相当类似。您只需在中用具体的类替换接口,rest应该可以工作。因此,有一个接口是模拟的必要条件?不完全是。不过,这是最常用的做法。看看答案的第二部分,你也可以做所谓的部分模拟,你可以只模拟一个方法而不是所有方法。视需要而定,但过程相当类似。您只需在中用具体的类替换接口,rest应该可以工作。