C# 无法在单元测试中使用moq
我刚开始使用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
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-接口是实现所必需的吗?它实际上不是必需的。但是,从接口继承实现并让使用者通过接口而不是通过直接实现类来工作是一种很好的做法。选中此项: