C# MOQ:如何将接口的模拟转换回接口

C# MOQ:如何将接口的模拟转换回接口,c#,unit-testing,moq,C#,Unit Testing,Moq,我正在尝试为一个需要接口(EnvDTE.Project)的私有方法编写单元测试 我正在使用Moq框架创建此接口的模拟: Mock<Project> mock = new Mock<Project>(); Mock Mock=new Mock(); 在设置属性之后,我想将这个模拟转换回接口。 我正在尝试这个: mock.As<Project>(); //to implement the Project interface Pr

我正在尝试为一个需要接口(EnvDTE.Project)的私有方法编写单元测试

我正在使用Moq框架创建此接口的模拟:

Mock<Project> mock = new Mock<Project>();
Mock Mock=new Mock();
在设置属性之后,我想将这个模拟转换回接口。 我正在尝试这个:

mock.As<Project>();                 //to implement the Project interface
Project project = mock as Project;  //this set Project to null
Project project = (Project)mock;    //this throws InvalidCastException
mock.As()//实现项目接口
项目=模拟为项目//此选项将项目设置为空
项目=(项目)模拟//这会引发InvalidCastException

还有别的办法解决这个问题吗

您可以通过以下方式访问模拟对象:

var mock = new Mock<Project>(); 
Project project = mock.Object;
var mock=new mock();
Project=mock.Object;

您可以通过以下方式访问模拟对象:

var mock = new Mock<Project>(); 
Project project = mock.Object;
var mock=new mock();
Project=mock.Object;

如前所述,您不需要模拟您正在做的事情

假设我们有一个叫做“项目”的课程


这将实现您想要的。

如前所述,您不需要模仿您正在做的事情

假设我们有一个叫做“项目”的课程



这将实现您想要的。

您不会创建类本身的模拟,而是创建它们所依赖的服务的模拟。然后您通常通过构造函数注入来注入这些依赖项。您的问题还不清楚。为什么要将模拟对象转换回接口?如果不转换,它不是按预期工作吗?你能解释一下你需要进行这种转换的具体用途吗?接口也没有私有方法。如果实现接口的类具有私有方法,那么应该通过对该特定类的单元测试而不是通过接口来测试它。我尝试使用PrivateObject.Invoke(“MethodName”,new object[]{MOCK(这里我需要一个接口,因为我不能使用MOCK)};您不需要专门测试私有方法。如果您为调用私有方法的类的公共方法编写适当的单元测试,覆盖所有逻辑流,则私有方法代码将自动测试。您可以使用代码覆盖工具查看哪些代码作为单元测试的一部分被覆盖和未被覆盖。因此,如果您的类
Project
拥有私有方法,并且正在实现接口
IProject
,那么您应该编写
Project
类的单元测试,以覆盖其私有方法的代码。您不创建类本身的模拟,而是创建它们所依赖的服务的模拟。然后,您通常通过构造函数注入这些依赖项r注入。您的问题还不清楚。为什么要将模拟对象转换回接口?不转换它是否能按预期工作?您能否解释需要执行此转换的具体用途?接口也没有私有方法。如果实现接口的类具有私有方法,则应使用私有方法不是通过接口,而是通过对特定类的单元测试来测试。我尝试使用PrivateObject.Invoke(“MethodName”,新对象[]{MOCK(这里我需要一个接口,因为我不能使用MOCK)}测试私有方法;您不需要专门测试私有方法。如果您为调用私有方法的类的公共方法编写适当的单元测试,覆盖所有逻辑流,则私有方法代码将自动测试。您可以使用代码覆盖工具查看哪些代码作为单元测试的一部分被覆盖和未被覆盖。因此,如果您的类
Project
拥有私有方法,并且正在实现接口
IProject
,那么您应该编写
Project
类的单元测试,以覆盖其私有方法的代码。@Designer-这如何允许您测试私有方法?@Wheels73使用该类的私有对象,然后我调用该方法并使用object数组来定义参数。我不是想聪明点。但是模拟对象的全部目的是因为您不想调用具体的实现。执行上面列出的操作与实例化项目类并只调用方法是一样的。当模拟对象时,您调用模拟上的Setup方法来说明inpu是什么如果您的测试通过了您创建的模拟对象中的代码行,那么这不是它的目的。我已经添加了一个答案供您参考。Cheers@Desiigner-这如何允许您测试私有方法?@Wheels73使用类的PrivateObject,然后我调用Method并使用对象数组来定义参数。我不是想聪明点。但模拟对象的全部目的是因为您不想调用具体的实现。执行上面列出的操作与实例化项目类并仅调用方法相同。模拟对象时,您在moc上调用Setup方法k来说明期望的输入和输出。如果您的测试通过了您创建的模拟对象中的代码行,那么这不是它的目的。无论如何,我已经为您添加了一个答案以供参考。谢谢,这适用于正常的单元测试,但不适用于此。是的,这适用于正常的单元测试,但不适用于此一
[TestMethod]
public void VerifyAmountTest()
{
   //Using PrivateObject class
   PrivateObject privateHelperObject = new PrivateObject(typeof(Project));
   double amount = 500F;
   bool expected = true;
   bool actual;
   actual = (bool)privateHelperObject.Invoke("VerifyAmount", amount);

   Assert.AreEqual(expected, actual); 
 }