Sto provando a eseguire alcune prove di base del codice del tipo di concetto per un nuovo progetto mvc3. Stiamo usando Moq con RavenDB.Mock IRavenQueryable con un'espressione Where() aggiunta
Azione:
public ActionResult Index(string id)
{
var model = DocumentSession.Query<FinancialTransaction>()
.Where(f => f.ResponsibleBusinessId == id);
return View(model);
}
prova:
private readonly Fixture _fixture = new Fixture();
[Test]
public void Index_Action_Returns_List_Of_FinancialTransactions_For_Business([Random(0, 50, 5)]int numberOfTransactionsToCreate)
{
// Arrange
var session = new Mock<IDocumentSession>();
var financialController = new FinancialController { DocumentSession = session.Object };
var businessId = _fixture.CreateAnonymous<string>();
var transactions = _fixture.Build<FinancialTransaction>()
.With(f => f.ResponsibleBusinessId, businessId)
.CreateMany(numberOfTransactionsToCreate);
// Mock
var ravenQueryableMock = new Mock<IRavenQueryable<FinancialTransaction>>();
ravenQueryableMock.Setup(x => x.GetEnumerator()).Returns(transactions.GetEnumerator);
ravenQueryableMock.Setup(x => x.Customize(It.IsAny<Action<Object>>()).GetEnumerator()).Returns(() => transactions.GetEnumerator());
session.Setup(s => s.Query<FinancialTransaction>()).Returns(ravenQueryableMock.Object).Verifiable();
// Act
var actual = financialController.Index(businessId) as ViewResult;
// Assert
Assert.IsNotNull(actual);
Assert.That(actual.Model, Is.InstanceOf<List<FinancialTransaction>>());
var result = actual.Model as List<FinancialTransaction>;
Assert.That(result.Count, Is.EqualTo(numberOfTransactionsToCreate));
session.VerifyAll();
}
Sembrerebbe che il problema è nella .Dove (f => f.ResponsibleBusinessId == id). Dal falso IRavenQueryable, sto restituendo un elenco di FinancialTransactions, quindi si penserebbe che .Where() filtrerebbe in base a ciò. Ma dal momento che è IQueryable, immagino che stia cercando di eseguire l'espressione tutto come una volta, quando enumera.
Per verificare, ho cambiato la query di azione per questo:
var model = DocumentSession.Query<FinancialTransaction>()
.ToList()
.Where(f => f.ResponsibleBusinessId == id);
Ciò lasciar passare di prova, tuttavia, non è l'ideale, in quanto questo significa che sta andando a elencare tutti i record, poi filtrare.
C'è un modo per far funzionare Moq con questo?
Come idea lato, invece di scherno fuori RavenDB, hai pensato di usare la incorporato nella versione di memoria? Prendere in giro con i metodi di estensione Linq è (davvero) orribile da gestire, e sono andato con RavenDB perché non c'è bisogno di prendere in giro il database. – Rangoric
Sono con @Rangoric - non c'è bisogno di prendere in giro le funzioni 'IDocumentSession' e' IDocumentStore' (o di deridere qualsiasi Ravendb) quando RavenDb ha un 'EmbeddedDocumentStore'. Amico, vai su http://jabbr.net/#/rooms/RavenDB e ci metteremo tutti a chiacchierare perché/perché no. –
Va bene - tranne che sto vedendo RavenDB impiegare troppo tempo per iniziare i miei test unitari - dicendo che "È progettato per non essere deriso" non è mai la risposta giusta. – Ronnie