2011-10-10 24 views
61

Tôi đang sử dụng lambda với chức năng nhiều tham số nhưng Moq ném ngoại lệ này vào thời gian chạy khi tôi cố gắng gọi đường dây mock.Object.Convert(value, null, null, null);.Kiểm tra đơn vị Moq + - System.Reflection.TargetParameterCountException: Số tham số không khớp

System.Reflection.TargetParameterCountException: Parameter count mismatch

Mã này là:

var mock = new Mock<IValueConverter>(); 

mock.Setup(conv => conv.Convert(It.IsAny<Object>(), It.IsAny<Type>(), 
    It.IsAny<Object>(), It.IsAny<CultureInfo>())).Returns((Int32 num) => num + 5); 

var value = 5; 
var expected = 10; 
var actual = mock.Object.Convert(value, null, null, null); 

cách thích hợp để thực hiện nó như thế nào?

Trả lời

108

Đó là khoản Returns của bạn. Bạn có một phương thức tham số 4 mà bạn đang thiết lập, nhưng bạn chỉ sử dụng một tham số lambda 1. Tôi chạy những điều sau đây mà không có vấn đề:

[TestMethod] 
public void IValueConverter() 
{ 
    var myStub = new Mock<IValueConverter>(); 
    myStub.Setup(conv => conv.Convert(It.IsAny<object>(), It.IsAny<Type>(), It.IsAny<object>(), It.IsAny<CultureInfo>())). 
     Returns((object one, Type two, object three, CultureInfo four) => (int)one + 5); 

    var value = 5; 
    var expected = 10; 

    var actual = myStub.Object.Convert(value, null, null, null); 

    Assert.AreEqual<int>(expected, (int) actual); 
} 

Không có trường hợp ngoại lệ, kiểm tra được thông qua.

+0

Tôi sẽ hỏi xem liệu đây có phải là một thử nghiệm của khung hay không, nhưng tôi đã cho rằng tôi sẽ cho lợi ích của nghi ngờ rằng có lẽ đó là mã tạm thời để cố gắng làm cho Mock cư xử đúng đắn. –

+0

Tôi giả sử nó là quá, nhưng nó làm cho tôi cười khúc khích anyway. –

+0

Tôi nghe ya. Khi tôi thực hiện mã, tôi nghĩ "yup, thư viện khung vẫn hoạt động." :) –

2

Có lẽ vì bạn đang vượt qua null nhưng It.IsAny<Object>() đang mong đợi bất kỳ object nào trừ null? Điều gì xảy ra nếu bạn làm như sau ?:

var actual = mock.Object.Convert(value, new object(), typeof(object), CultureInfo.CurrentCulture); 

Đây chỉ là đâm trong bóng tối của tôi, tôi quen thuộc hơn với Rhino.Mocks.


đoán thứ 2 của tôi:

Sau khi nhìn vào Moq.chm mà đi kèm với việc tải xuống,

Bạn đang sử dụng phương pháp Setup(Expression<Action<T>>) mà "Chỉ định một thiết lập vào loại chế nhạo cho một cuộc gọi theo phương pháp void. "

Bạn muốn phương thức te Setup<TResult>(Expression<Func<T,TResult>>) "Chỉ định thiết lập trên loại giả cho cuộc gọi đến phương thức trả về giá trị".

Vì vậy, bạn có thể thử:

mock.Setup<Int32>(
    conv => { 
     conv.Convert(
      It.IsAny<Object>(), 
      It.IsAny<Type>(), 
      It.IsAny<Object>(), 
      It.IsAny<CultureInfo>()); 
     return num + 5; 
     }); 
+0

mock.Setup nhập kiểu trả về làm Đối tượng vì phương thức Chuyển đổi trả về Đối tượng. –

4

Không phải là câu trả lời cho OP nhưng có lẽ đối với nhân viên của Google trong tương lai:

Tôi đã có một Callback điều đó không khớp với chữ ký của phương pháp được thiết lập

Mock 
    .Setup(r => r.GetNextCustomerNumber(It.IsAny<int>())) 
    .Returns(AccountCounter++) 
    .Callback<string, int>(badStringParam, leadingDigit => 
    { 
     // Doing stuff here, note that the 'GetNextCustomerNumber' signature is a single int 
     // but the callback unreasonably expects an additional string parameter. 
    }); 

Đây là kết quả của một số refactoring và các công cụ tái cấu trúc tất nhiên không thể nhận ra rằng các chữ ký Callback là không chính xác

+0

wow, tôi đã đập đầu của tôi chống lại vấn đề tương tự này và nhận được giữ bóng ngay trên gọi lại cho đến khi tôi đọc bài viết của bạn. Hugely hữu ích và tôi vui vì bạn đã đăng nó. – dblood

1

Trong trường hợp của tôi, tôi nghĩ rằng loại trong Returns<> là loại đầu ra, nhưng trên thực tế nó là kiểu đầu vào (s).

Vì vậy, nếu bạn có một phương pháp

public virtual string Foo(int a, int b) { ... } 

Mệnh đề đúng là .Returns<int, int>(...), KHÔNG .Returns<string>(...) đó là những gì tôi nghĩ ban đầu.

Lỗi của tôi là vì tôi đã thử nghiệm một hàm có cùng kiểu nhập và trả về ban đầu - ví dụ: public virtual string Foo(string a).

Các vấn đề liên quan