2

モック オブジェクトでプライベート メソッドをテストしようとしています。落ち着いてください、熊手を出しているのはわかっています。

これから言うことはすべて、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

私がやろうとしていることは、狂っていますが、可能ですか? それとも、単体テストが耐えるにはあまりにも傲慢なのでしょうか?

4

3 に答える 3

2
var privateObj = new PrivateObject(mgr.Object, new PrivateType(typeof(SecretManager)));
string secretmsg = privateObj.Invoke("RevealSecretMessage");

に指定することで動作PrivateTypePrivateObjectます。

于 2016-10-09T09:26:01.730 に答える
0

コードは、テストしようとしているものに従っている必要があります。SecretManager と SetGet "AwfulThing" は使用していないため、モックする必要はありません。

var privateObj = new PrivateObject(new SecretManager());
string secretmsg = (string)privateObj.Invoke("RevealSecretMessage", new object[] {     });

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

しかし理想的には、Private メソッドをテストするべきではありません。説明については、以下の記事を参照してください。

http://lassekoskela.com/thoughts/24/test-everything-but-not-private-methods/

于 2014-01-07T03:33:33.797 に答える