Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/31.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/amazon-s3/2.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#_Asp.net_Unit Testing_Dependency Injection_Moq - Fatal编程技术网

C# 无法在单元测试中使用moq

C# 无法在单元测试中使用moq,c#,asp.net,unit-testing,dependency-injection,moq,C#,Asp.net,Unit Testing,Dependency Injection,Moq,我刚开始使用moq对象进行单元测试,我不确定我是否做得对,请帮助 Public Class Mrr: IMrr { public int Delete(double obj) { int rtcode = somefunction(obj);// retreiving some code from function int DeleteMrr= DeleteFunction(rtcode); // delete function executes

我刚开始使用moq对象进行单元测试,我不确定我是否做得对,请帮助

Public Class Mrr: IMrr
{ 

   public int Delete(double obj)
   {
        int rtcode = somefunction(obj);// retreiving some code from function
        int DeleteMrr= DeleteFunction(rtcode);  // delete function executes here          
        return 0;
   }

}
这里是界面

public interface IMrr
{
    int Delete(double obj);
}
我的测试方法是这样的

[TestMethod()] 
public void RetrieveSaveDeleteMRR()
{      
    var FakeObject = new Moq.Mock<IMrr>();
    FakeObject.Setup(x => x.Delete(It.IsAny<int>())).Returns(0);
    var Res = FakeObject.Object.Delete(10);
}
[TestMethod] 
public void RetrieveSaveDeleteMRR()
{    
    // Arange
    int expected = 1;
    Moq.Mock<IDelete> deleteObjectMock = new Moq.Mock<IDelete>();
    deleteObjectMock.Setup(x => x.DeleteFunction(It.IsAny<int>())).Returns(1000);
    Mrr testedObject = new Mrr(deleteObjectMock.Object);

    // Act
    int actual = testedObject.Delete(10);

    // Assert
    Assert.AreEqual(expected, actual);
}
[TestMethod()]
公共无效检索SaveDeleteMRR()
{      
var FakeObject=new Moq.Mock();
Setup(x=>x.Delete(It.IsAny())。返回(0);
var Res=FakeObject.Object.Delete(10);
}

这不是执行该方法的实际函数,它是否应该执行该方法。我不确定

如果要测试
Mrr.Delete()
方法,则不应模拟
Mrr
。您应该创建
Mrr
类的真实实例并调用其方法

您通常希望模拟
Mrr
依赖项(在您的示例中没有),以便不调用真正的依赖项方法


注意:您忘记从接口
IMrr
继承
Mrr

在您的示例中,类
Mrr
没有任何依赖关系。要解释什么是依赖关系,请看下面的示例

public class Mrr: IMrr
{ 
    // This is dependency
    IDelete _deleteObject;

    public Mrr(IDelete deleteObject)
    {
        _deleteObject = deleteObject;
    }

   public int Delete(double obj)
   {
        int rtcode = somefunction(obj);
        int DeleteMrr = _deleteObject.DeleteFunction(rtcode);  
        return 0;
   }
}

public interface IDelete
{
    int DeleteFunction(int rtcode);
}
此依赖项在构造函数中传递,所以您可以在测试中提供自己的模拟实例

与这种情况相比:

public class Mrr: IMrr
{ 
    // This is dependency
    IDelete _deleteObject;

    public Mrr()
    {
        _deleteObject = new DeleteClass();
    }
}
每次使用
new
,就不可能在单元测试中注入您自己的实现

测试结果可能是这样的

[TestMethod()] 
public void RetrieveSaveDeleteMRR()
{      
    var FakeObject = new Moq.Mock<IMrr>();
    FakeObject.Setup(x => x.Delete(It.IsAny<int>())).Returns(0);
    var Res = FakeObject.Object.Delete(10);
}
[TestMethod] 
public void RetrieveSaveDeleteMRR()
{    
    // Arange
    int expected = 1;
    Moq.Mock<IDelete> deleteObjectMock = new Moq.Mock<IDelete>();
    deleteObjectMock.Setup(x => x.DeleteFunction(It.IsAny<int>())).Returns(1000);
    Mrr testedObject = new Mrr(deleteObjectMock.Object);

    // Act
    int actual = testedObject.Delete(10);

    // Assert
    Assert.AreEqual(expected, actual);
}
[TestMethod]
公共无效检索SaveDeleteMRR()
{    
//阿兰奇
int预期为1;
Moq.Mock deleteObjectMock=新的Moq.Mock();
deleteObjectMock.Setup(x=>x.DeleteFunction(It.IsAny())。返回(1000);
Mrr testedObject=新的Mrr(deleteObjectMock.Object);
//表演
int-actual=testedObject.Delete(10);
//断言
断言.AreEqual(预期、实际);
}

HI,我编辑了我的代码,你能告诉我你在这里谈论的真正的依赖关系是什么吗?请检查这个基本教程,了解Moq-接口是实现所必需的吗?它实际上不是必需的。但是,从接口继承实现并让使用者通过接口而不是通过直接实现类来工作是一种很好的做法。选中此项: