Sto avviando un nuovo progetto con NHibernate, ASP.NET MVC 2.0 e StructureMap e utilizzando NUnit e Moq per il test. Per ognuno dei miei controller ho un singolo costruttore pubblico nel quale viene iniettata una ISession. L'applicazione stessa funziona bene, ma in termini di test delle unità devo essenzialmente prendere in giro un'ISession per testare i controller.Mocking di una NHibernate ISession con Moq
Quando si tenta di prendere in giro l'ISession con MOQ ottengo il seguente messaggio di errore:
Sono supportati solo accessi di proprietà nelle invocazioni intermedie
Sembra che il mio problema si aspetta Lista utenti dal metodo CreateQuery del framework ma dopo aver cercato su Google il problema ora sono più chiaro.
Ho due domande:
1) È questo il modo sbagliato di deridere l'iniezione di dipendenza di un ISession
2) c'è un modo per modificare il codice in modo che possa tornare con successo la mia lista
[Test]
public void DummyTest()
{
var mock = new Mock<ISession>();
var loc = new Mock<User>();
loc.SetupGet(x => x.ID).Returns(2);
loc.SetupGet(x => x.FirstName).Returns("John");
loc.SetupGet(x => x.LastName).Returns("Peterson");
var lst = new List<User> {loc.Object};
mock.Setup(framework => framework.CreateQuery("from User").List<User>()).Returns(lst);
var controller = new UsersController(mock.Object);
var result = controller.Index() as ViewResult;
Assert.IsNotNull(result.ViewData);
}
si prega di notare, io sono abbastanza sicuro che avrei potuto solo creare un elenco hardcoded di utenti (piuttosto che beffardo un singolo utente e l'aggiunta a una lista), ma ho pensato di lasciare il codice come ce l'ho proprio adesso.
Inoltre, l'azione Index di questo controller particolare esegue essenzialmente la chiamata CreateQuery imitata sopra per restituire tutti gli utenti nel database. Questo è un esempio forzato: non leggere nulla nei dettagli.
Grazie in anticipo per il vostro aiuto
Edit: In risposta al commento qui sotto, sto aggiungendo lo StackTrace per l'errore. Inoltre, tutte le proprietà della classe User sono virtuali.
TestCase 'Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView' riuscita: System.NotSupportedException: Solo accessi di proprietà sono supportati in invocazioni intermedie su una configurazione . Espressione non supportata framework.CreateQuery ("from User"). a Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (MethodCallExpression m) a Moq.ExpressionVisitor.Visit (Espressione exp) a Moq.Mock.AutoMockPropertiesVisitor.VisitMethodCall (MethodCallExpression m) a Moq.ExpressionVisitor.Visit (Expression exp) a Moq.Mock.AutoMockPropertiesVisitor.SetupMocks (Expression espressione) a Moq.Mock.GetInterceptor (LambdaExpression lambda, finto Mock) a Moq.Mock. <> c__DisplayClass12 funzione) a Moq.Mock.Setup [T1, TResult] (finto Mock, Espressione
1 expression) at Moq.Mock
1.Imp [TResult] (Expression`1 espressione) Controllori \ UserControllerTest.cs (29,0): a Beta.Tests.Unit.Controllers.UserControllerTest.Details_InValidIndex_ReturnsNotFoundView()
Potrebbe mostrare uno stacktrace dell'errore? Le proprietà dell'utente sono astratte o virtuali? –