2012-07-24 40 views
6

Về cơ bản, một số thử nghiệm của tôi đang thành công, một số không thành công. Theo đề xuất tuyệt vời của ông Skeet, tôi đã tạo ra một mẫu mã đầy đủ để xác nhận rằng tôi không điên. Đây là mã:Chạy vào System.MissingMethodException: Phương thức không tìm thấy với PrivateObject

namespace ClassLibrary 
{ 
    using System; 

    public class Manager 
    { 
     private int SampleMethod(int id) 
     { 
      return id; 
     } 
    } 
} 

thử nghiệm của tôi là:

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); 
     } 
    } 
} 

Các thử nghiệm đầu tiên (TestPasses()) hoạt động.

Các thử nghiệm thứ hai (TestErrorsOut()) không thành công với các lỗi sau: { "Phương pháp 'ClassLibrary.Manager.SampleMethod' không tìm thấy"}

Điều khó hiểu là lỗi này là phù hợp, nhưng thực tế kiểm tra gần như giống hệt nhau. Không có nghĩa lý gì. Tôi đã thử điều này trên VS2012 RC và VS2010, với kết quả tương tự.

Điều duy nhất tôi có thể nghĩ là "0" đang được truyền dưới dạng int, có nghĩa là nó không thể tìm thấy chữ ký phương thức của SampleMethod? Tôi đã thử một thử nghiệm thứ ba để rõ ràng vượt qua trong loại tôi đang tìm kiếm (TestAlsoErrorsOut()), nhưng đó cũng lỗi ra với cùng một lỗi.

Ý tưởng? Cảm ơn.

Chỉnh sửa để thêm

Bằng cách sử dụng gợi ý của việc sử dụng Ian của các obj [] thay vì params obj [] quá tải, nó hoạt động (kiểm tra TestWorksAsWell()). Và điều đó giải thích tại sao TestAlsoErrorsOut() không thành công, bởi vì tôi đang sử dụng phương thức params, nó sẽ không hoạt động với Type []. Vì vậy, điều này là cố định. Nhưng tại sao? Tại sao params sẽ làm việc khi đi qua 1, nhưng không phải là 0?

+3

bạn có thể chỉ cho một chương trình ngắn nhưng đầy đủ để chứng minh vấn đề này? Nó là một lỗi đánh máy của 1 cho l hoặc một cái gì đó như thế? –

+0

Tại sao bạn muốn đơn vị thử nghiệm một phương pháp riêng tư? – Anuraj

+1

@Anuraj - Tôi trì hoãn bài viết này về "tại sao", nhưng tôi không nghĩ đây là diễn đàn để thảo luận về điều đó. http://www.codeproject.com/Articles/9715/How-to-Test-Private-and-Protected-methods-in-NET. – bryanjonker

Trả lời

9

Theo tài liệu (http://msdn.microsoft.com/en-us/library/ms243710.aspx), đối số được cho là được truyền dưới dạng một mảng đối tượng. Một cách rõ ràng qua một mảng đối tượng xuất hiện để làm việc một cách chính xác:

var actual = (int)privateInfo.Invoke("SampleMethod", new object[] {0}); 

Đi qua 0 trên xuất hiện riêng của mình để dẫn đến việc biên dịch chọn quá tải này

Invoke(string name = "SampleMethod", System.Reflection.BindingFlags bindingFlags = Default, object[] args = {object[0]}) 
+0

Trong trường hợp của tôi, tôi đã cho nó như var inputObj = new Object [2]; eventhough tôi đã đi qua chỉ là một tham số đầu vào .. thay đổi thành var inputObj = new Object [1]; giải quyết vấn đề của tôi – Ziggler

0

tôi đã nhận được System.MissingMethodException khi gọi các thử nghiệm sau đây :

PrivateObject shadow = new PrivateObject(target);  
shadow.Invoke("PrivateMethod", new string[]{"arg1","arg2"}); 

On chữ ký phương pháp riêng của mục tiêu

private void PrivateMethod(string[] args) 

tôi đã có thêm params để chữ ký phương pháp riêng để giải quyết các trường hợp ngoại lệ như sau:

private void PrivateMethod(params string[] args) 
Các vấn đề liên quan