我正在尝试在模拟对象上测试私有方法。请冷静,我知道你要把干草叉弄出来。

我很清楚要说的所有内容都可以通过对我大喊REFACTOR来回答。我只需要一个简单的答案。有人看着我,告诉我这无法完成。这是一个无法解决的问题,所以我只需要听听它。

这就是我要处理的。

public class SecretManager
{
   protected virtual string AwfulString { get { return "AWFUL, AWFUL THING"; }

   public SecretManager()
   {
      //do something awful that should be done using injection
   }

   private string RevealSecretMessage()
   {
      return "don't forget to drink your ovaltine";
   }
}


这是我尝试测试的方法。

var mgr = new Mock<SecretManager>();
mgr.Protected().SetupGet<string>("AwfulThing").Returns("");

var privateObj = new PrivateObject(mgr.Object);
string secretmsg = privateObj.Invoke("RevealSecretMessage");

Assert.IsTrue(secretmsg.Contains("ovaltine"));


和例外:

System.MissingMethodException: Method 'Castle.Proxies.SecretManagerProxy.RevealSecretMessage' not found


我正在尝试做的事情,可能是疯狂的吗?还是对于单元测试而言,这简直就是太多的傲慢?

最佳答案

您正在尝试在Castle创建的代理上调用方法。代理将无法访问其继承的类上的private方法,因为该方法是私有的。请记住,Castle.Proxies.SecretManagerProxy实际上是SecretManager的子类。

您真的需要模拟SecretManager吗?我意识到您的代码是实际代码的精简摘要,但是似乎您使用该模拟方法所做的唯一一件事就是为您想要尝试测试的方法未使用的属性设置返回值。

10-08 11:46