基本上,我的一些測試成功,有些失敗。根據Skeet先生的出色建議,我創建了一個完整的代碼樣本來確認我並不瘋狂。這是代碼:遇到System.MissingMethodException:未找到與PrivateObject的方法
namespace ClassLibrary
{
using System;
public class Manager
{
private int SampleMethod(int id)
{
return id;
}
}
}
我的測試是:
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);
}
}
}
第一個測試(TestPasses())的作品。
第二次測試(TestErrorsOut())失敗,出現以下錯誤: {「法‘ClassLibrary.Manager.SampleMethod’找不到」}
莫明其妙的事是錯誤的是一致的,但實際測試幾乎完全相同。這個不成立。我在VS2012 RC和VS2010上試了這個,結果相同。
我能想到的唯一的事情就是將「0」投射爲除int之外的東西,這意味着它無法找到SampleMethod的方法簽名?我嘗試了第三次測試來顯式傳遞我正在尋找的類型(TestAlsoErrorsOut()),但是也出現了錯誤。
想法?謝謝。
編輯補充
通過使用使用的伊恩的建議與obj []而不是PARAMS OBJ []過載,它的工作原理(測試TestWorksAsWell())。這就解釋了爲什麼TestAlsoErrorsOut()失敗,因爲我使用了params方法,這不適用於Type []。所以,這是固定的。但爲什麼?爲什麼params obj []在傳遞1而不是0時工作?
你能告訴一個簡短而完整的程序來演示這個問題?對於l或類似的東西是否是1的錯字? – 2012-07-24 23:43:16
爲什麼你想單元測試一個私有方法? – Anuraj 2012-07-25 11:03:28
@Anuraj - 我接受這篇關於「爲什麼」的文章,但我不認爲這是討論這個問題的論壇。 http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET。 – bryanjonker 2012-07-25 11:20:26