Tôi đang cố gắng thực hiện một số bằng chứng cơ bản về mã loại khái niệm cho dự án mvc3 mới. Chúng tôi đang sử dụng Moq với RavenDB.Mock IRavenQueryable với biểu thức Where() nối thêm
Hành động:
public ActionResult Index(string id)
{
var model = DocumentSession.Query<FinancialTransaction>()
.Where(f => f.ResponsibleBusinessId == id);
return View(model);
}
Test:
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();
}
Nó sẽ xuất hiện vấn đề là trong .Where (f => f.ResponsibleBusinessId == id). Từ IRavenQueryable được chế giễu, tôi sẽ trả về danh sách các TransactionTransactions, vì vậy người ta sẽ nghĩ .Where() sẽ lọc dựa trên đó. Nhưng vì nó là IQueryable, tôi đoán nó đang cố gắng thực hiện biểu thức tất cả là một, khi nó liệt kê.
Để xác minh, tôi đã thay đổi truy vấn của người hành động như thế này:
var model = DocumentSession.Query<FinancialTransaction>()
.ToList()
.Where(f => f.ResponsibleBusinessId == id);
này để cho các đường chuyền kiểm tra, tuy nhiên, nó không phải là lý tưởng, vì điều đó có nghĩa là nó sẽ liệt kê tất cả các hồ sơ, sau đó lọc chúng.
Có cách nào để Moq hoạt động với điều này không?
Là một ý tưởng phụ, thay vì chế nhạo RavenDB, bạn có nghĩ đến việc sử dụng phiên bản Nhúng trong bộ nhớ không? Mocking với phương pháp mở rộng LINQ là (thực sự) khủng khiếp để đối phó với, và tôi đã đi với RavenDB vì không có nhu cầu thực sự để thử ra cơ sở dữ liệu. – Rangoric
Tôi đang sử dụng @Rangoric - không cần phải giả lập công cụ 'IDocumentSession' và' IDocumentStore' (hoặc chế giễu bất kỳ Ravendb) nào khi RavenDb có một 'EmbeddedDocumentStore'. Dude, nhảy vào http://jabbr.net/#/rooms/RavenDB và tất cả chúng ta sẽ trò chuyện với bạn tại sao/tại sao không. –
Điều đó là tốt - ngoại trừ việc tôi thấy RavenDB mất quá nhiều thời gian để bắt đầu kiểm tra đơn vị của tôi - nói rằng "Nó được thiết kế không bị chế giễu" không phải là câu trả lời đúng. – Ronnie