2014-01-06 2 views
1

Я пытаюсь проверить частный метод на издеваемом объекте. Пожалуйста, успокойтесь, я знаю, что вы получаете свои вилы.Мог несовместим с PrivateObject?

Я хорошо знаю, что все, о чем можно сказать, можно ответить, крича РЕАКТОРОМ у меня. Мне просто нужен прямой ответ. Кто-то смотрит мне в глаза и говорит, что это невозможно. Это непрогрессивная проблема, поэтому мне просто нужно ее услышать.

Вот что я имею в виду.

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 

Это то, что я пытаюсь сделать, с ума, как это, возможно? Или это слишком большая гордость за единичный тест?

ответ

3

Вы пытаетесь вызвать метод на прокси-сервере, созданный Законом. Прокси не будет иметь доступа к частному методу класса, на который он наследует, потому что, к примеру, этот метод является закрытым. Помните, что Castle.Proxies.SecretManagerProxy на самом деле является подклассом SecretManager.

Вам действительно нужен макет SecretManager? Я понимаю, что ваш код - это уменьшенный абстрактный код реального кода, но, похоже, единственное, что вы делаете с макетом, - это создание возврата для свойства, которое не используется методом, который вы пытаетесь протестировать в любом случае ,

1

Ваш код должен следовать за тем, что вы пытаетесь проверить. Вам не нужно издеваться над SecretManager и SetGet «AwfulThing», поскольку вы его не используете.

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

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

Но в идеале вы не должны испытывать частные методы. Ниже статье для объяснения:

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

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

Он будет работать, указав PrivateType для PrivateObject.

Смежные вопросы