Zasadniczo niektóre z moich testów się powiodły, niektóre nie. Zgodnie z doskonałą sugestią pana Skeeta, stworzyłem pełną próbkę kodu, aby potwierdzić, że nie jestem szalona. Jest to kod:Uruchomiony do System.MissingMethodException: Metoda nie znaleziona z PrivateObject
namespace ClassLibrary
{
using System;
public class Manager
{
private int SampleMethod(int id)
{
return id;
}
}
}
Mój test jest:
namespace UnitTestProject
{
using System;
using Microsoft.VisualStudio.TestTools.UnitTesting;
[TestClass]
public class UnitTest
{
[TestMethod]
public void TestPasses()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
var actual = privateInfo.Invoke("SampleMethod", 1);
}
[TestMethod]
public void TestErrorsOut()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
var actual = privateInfo.Invoke("SampleMethod", 0);
}
[TestMethod]
public void TestWorksAsWell()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
privateInfo.Invoke("SampleMethod", new object[] { 0 });
}
[TestMethod]
public void TestAlsoErrorsOut()
{
var privateInfo = new PrivateObject(new ClassLibrary.Manager());
var types = new Type[] { typeof(int) };
var actual = privateInfo.Invoke("SampleMethod", types, 0);
}
}
}
Pierwszy test (TestPasses()) działa.
Drugi test (TestErrorsOut()) nie powiedzie się z powodu następującego błędu: { „Metoda«ClassLibrary.Manager.SampleMethod»nie znaleziono”}
zaskakujące jest to błąd jest spójny, ale rzeczywista test jest prawie identyczny. To nie ma sensu. Próbowałem tego na VS2012 RC i VS2010, z tymi samymi wynikami.
Jedyne, co mogę wymyślić to "0" to rzucanie jako czegoś poza int, co oznacza, że nie może znaleźć sygnatury metody SampleMethod? Próbowałem trzeciego testu, aby jawnie przekazać typ, którego szukam (TestAlsoErrorsOut()), ale to również powoduje błędy z tym samym błędem.
Pomysły? Dzięki.
Edytuj, aby dodać
Korzystając sugestię Iana z wykorzystaniem obj [] zamiast params OBJ [] przeciążenie, to działa (test TestWorksAsWell()). I to wyjaśnia, dlaczego TestAlsoErrorsOut() nie działa, ponieważ używam metody params, która nie działałaby z Type []. Naprawiono to. Ale dlaczego? Dlaczego params obj [] działają przy przekazywaniu 1, ale nie 0?
można pokazać krótki, ale kompletny program do wykazania problem? Czy jest to literówka 1 dla l, czy coś w tym stylu? –
Dlaczego chcesz przetestować metodę prywatną? – Anuraj
@Anuraj - Odkładam ten artykuł na temat "dlaczego", ale nie sądzę, że to jest forum do dyskusji. http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET. – bryanjonker