最小起订量:如何将接口的 Mock 转换回接口

MOQ: How to cast a Mock of an Interface back to the interface

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

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

Mock<Project> mock = new Mock<Project>();

设置属性后,我想将此模拟转换回界面。 我正在尝试这个:

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

还有其他方法可以解决这个问题吗?

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

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

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

假设我们有一个名为 "Project" 的 class。

public class Project
    {
        //Private method to test
        private bool VerifyAmount(double amount)
        {
            return (amount <= 1000);
        }
    }

然后我们可以使用您想要的 PrivateObject 方法编写测试。

[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); 
 }

这将实现你想要的。