Tôi có một phương pháp chế giễu đó trông như thế này:Gọi Func trôi qua như một tham số để một mô hình sử dụng Moq và C#
class NotMineClass {
T Execute(Func operation)
{
// do something
return operation();
}
}
Trong mã của tôi, tôi làm như:
public MyType MyMethod()
{
MyType object = new MyType();
bool success = notMineClassInstance.Execute(() =>
{
// some things
retVal = injectedObject1.method();
object.attribute = injectedObject2.method();
// some other things
return retVal;
}
if (success)
{
object.otherAttribute = someValue;
}
return object;
}
My trường hợp là, tôi đang thử nghiệm MyMethod với Moq và tôi muốn xác minh hành vi Func như mong đợi. Tôi có một số đối tượng tiêm trong cơ thể của nó, đó là mocks, và cần được xác minh; nó cũng bắt đầu xây dựng giá trị trả về của tôi, vì vậy tôi không thể thực hiện bất kỳ xác nhận nào trừ khi tôi gọi hàm được chuyển thành tham số.
Trong Java và JUnit + EasyMock, tôi sẽ nắm bắt thông số trôi qua, như thế này:
public void testMyMethod() {
// ...
Capture < Function < void, Boolean > > functionCapture = Captures.last();
expect(notMineClassInstance.execute(EasyMock.capture(functionCapture)));
// Expectations for the body of the function
replay();
functionCapture.getValue().apply(null);
}
Làm thế nào để làm điều tương tự bằng C# + Moq?
Có vẻ tuyệt vời, nhưng khi tôi làm điều này, tôi nhận được lỗi sau: * Kiểm tra 'không thành công: System.NullReferenceException: Tham chiếu đối tượng không được đặt thành phiên bản của đối tượng. tại Test. b__0 (Func'1 bị bắt) * –
@ LuísGuilherme xem mẫu thử hoàn chỉnh –
Nó hoạt động ngay từ đầu. Tôi đã nhận được một tham chiếu Null bên trong cuộc gọi Func :) –