2012-02-07 9 views
5

Mam poniższy kod, gdzie moja Mock interfejs ma właściwość Recorder, który jest klasą.Ustawianie nieruchomość makiety poprzez przyczyn Setup „wyrażenie nie jest metoda A inwokacja”

I spróbuj ustawić właściwość w tej klasie, ale pojawia się błąd Expression is not a method invocation. Czy mógłbyś pomóc?

Błąd znajduje się przy starcie, gdy idzie do spróbować ustawić właściwość enum. To rzuca ArgumentException z poniższego śladu stosu:

at Moq.ExpressionExtensions.ToMethodCall(LambdaExpression expression) 
    at Moq.Mock.<>c__DisplayClass1c`2.<Setup>b__1b() 
    at Moq.PexProtector.Invoke[T](Func`1 function) 
    at Moq.Mock.Setup[T,TResult](Mock mock, Expression`1 expression, Func`1 condition) 
    at Moq.Mock`1.Setup[TResult](Expression`1 expression) 

Dzięki

//Works 
var mock = new Moq.Mock<IEngine>(); 
//Works 
mock.Setup(x => x.Recorder).Returns(new Moq.Mock<Recorder>().Object); 
//Fails on the next line assigning a property value!!! 
mock.Setup(x => x.Recorder.RunState).Returns(Recorder.eRunStates.Play); 

AKTUALIZACJA - I odkryli, że RunState nie jest własnością, ale pole/członek, który jest ENUM

+0

Czy możesz nam powiedzieć * gdzie * pojawia się błąd? Czy jest to błąd podczas kompilacji lub błąd czasu wykonania, a jeśli jest to błąd czasu wykonania, kiedy to wystąpi? –

+0

@ JonSucket done! – Jon

+0

A więc, które połączenie nie działa - pierwsze czy drugie? (Jeśli jest pierwszy, usuńmy drugi obraz ze zdjęcia ...) –

Odpowiedz

6

I odkryli, że tworzenie makiety rejestratora, a następnie przypisanie wartości do makiety obiektu wydaje się rozwiązać problem. Nie jestem pewien, czy to jest właściwy sposób robienia rzeczy.

var mockRecorder = new Moq.Mock<Recorder>(); 
mockRecorder.Object.RunState = Recorder.eRunStates.Play; 
4

Myślę, że powinieneś zwrócić próbę, którą utworzyłeś w pierwszej części dla drugiej części:

var mockRecorder = new Moq.Mock<Recorder>(); 
mock.Setup(x => x.Recorder).Returns(mockRecorder.Object); 
mockRecorder.Setup(x => x.RunState).Returns(Recorder.eRunStates.Play); 

To tylko przypuszczenie, bez wykorzystywane Moq siebie - ale ma to sens.

Jednak to wygląda to będzie w końcu jest dość kruche. Można rozważyć użycie fałszywy zamiast tutaj - przynajmniej jednej obiektów, jeśli nie oba.

EDIT: Patrząc na documentation, alternatywą byłoby:

// Moq will set up the hierarchy for you... 
mock.Setup(x => x.Recorder.RunState).Returns(Recorder.eRunStates.Play); 
+0

Powoduje to niestety ten sam błąd. Przez fałszywe masz na myśli odręczny? – Jon

+0

@Jon: Tak. Czuć się dość kruche, aby polegać na określonych właściwościach. –

+0

To jest paskudny kod źródłowy i jestem na granicy poddania się szczerze mówiąc – Jon

1

Trzeba wykonać instalację na atrapa obiektu do skonfigurowania właściwości RunState zamiast.

var mockRecorder = new Mock<Recorder>(); 
mockRecorder.Setup(x => x.RunState).Returns(eRunStates.Play); 

mock.Setup(x => x.Recorder).Returns(mockRecorder.Object); 

EDIT: FYI, trzeba wykonać całą instalację na mock przed uzyskaniem dostępu do własności .Object gdy obiekt jest tworzony w tym miejscu i dalsze konfiguracje nie może się zdarzyć.

Ponadto, kilka sugestii, wygląda na to, że twoje wyliczenie dla stanów uruchomionych jest zagnieżdżone w klasie rejestratora, przeniesię je do oddzielnej klasy & dodatkowo upuść prefiks "e".

2

Jeśli używasz SetupGet na mocks zamiast ustawiania to zadziała

var mockRecorder = new Moq.Mock<Recorder>(); 
mock.SetupGet(x => x.Recorder).Returns(mockRecorder.Object); 
mockRecorder.SetupGet(x => x.RunState).Returns(Recorder.eRunStates.Play); 
+0

Ten sam problem. Zauważyłem, że to pole nie jest właściwością. – Jon

+0

Czy potrzebujesz więc makiety? – Ciaran

+0

Tak, ponieważ muszę stwierdzić, że metoda w IEngine jest wywoływana, ale należy ją wyśmiać i przekazać innej klasie. – Jon

Powiązane problemy