Tôi vừa chuyển sang Moq và đã gặp sự cố. Tôi đang thử nghiệm một phương thức tạo ra một cá thể mới của một đối tượng nghiệp vụ, thiết lập các thuộc tính của đối tượng từ các giá trị đầu vào của người dùng và gọi một phương thức (SaveCustomerContact) để lưu đối tượng mới. Đối tượng nghiệp vụ được truyền dưới dạng đối số ref vì nó đi qua lớp truy cập từ xa. Tôi cần phải kiểm tra rằng đối tượng được chuyển đến SaveCustomerContact có tất cả các thuộc tính của nó được thiết lập như mong đợi, nhưng vì nó được khởi tạo như mới trong phương thức điều khiển, tôi không thể làm như vậy.Xác minh giá trị tham số tham chiếu với Moq
public void AddContact() {
var contact = new CustomerContact() { CustomerId = m_model.CustomerId };
contact.Name = m_model.CustomerContactName;
contact.PhoneNumber = m_model.PhoneNumber;
contact.FaxNumber = m_model.FaxNumber;
contact.Email = m_model.Email;
contact.ReceiveInvoiceFlag = m_model.ReceiveInvoiceFlag;
contact.ReceiveStatementFlag = m_model.ReceiveStatementFlag;
contact.ReceiveContractFlag = m_model.ReceiveContractFlag;
contact.EmailFlag = m_model.EmailFlag;
contact.FaxFlag = m_model.FaxFlag;
contact.PostalMailFlag = m_model.PostalMailFlag;
contact.CustomerLocationId = m_model.CustomerLocationId;
RemotingHandler.SaveCustomerContact(ref contact);
}
Dưới đây là các bài kiểm tra:
[TestMethod()]
public void AddContactTest() {
int customerId = 0;
string name = "a";
var actual = new CustomerContact();
var expected = new CustomerContact() {
CustomerId = customerId,
Name = name
};
model.Setup(m => m.CustomerId).Returns(customerId);
model.SetupProperty(m => model.CustomerContactName, name);
model.SetupProperty(m => m.PhoneNumber, string.Empty);
model.SetupProperty(m => m.FaxNumber, string.Empty);
model.SetupProperty(m => m.Email, string.Empty);
model.SetupProperty(m => m.ReceiveInvoiceFlag, false);
model.SetupProperty(m => m.ReceiveStatementFlag, false);
model.SetupProperty(m => m.ReceiveContractFlag, false);
model.SetupProperty(m => m.EmailFlag, false);
model.SetupProperty(m => m.FaxFlag, false);
model.SetupProperty(m => m.PostalMailFlag, false);
model.SetupProperty(m => m.CustomerLocationId, 0);
remote
.Setup(r => r.SaveCustomerContact(ref actual))
.Callback(() => Assert.AreEqual(actual, expected));
target.AddContact();
}
Đây mới chỉ là gần đây nhất của nhiều nỗ lực để có được Ahold của tham số đó. Để tham khảo, giá trị của thực tế không thay đổi từ trạng thái ban đầu (được xây dựng) của nó.
Di chuyển Assert.AreEqual (dự kiến, thực tế) sau khi cuộc gọi đích không thành công. Nếu tôi thêm .Verifiable() vào thiết lập thay vì .CallBack và sau đó gọi remote.Verify sau khi mục tiêu (hoặc, tôi giả định, thiết lập mô hình để nghiêm ngặt) nó luôn luôn thất bại vì tham số tôi cung cấp trong thử nghiệm không phải là ví dụ tương tự như trường hợp được tạo trong phương thức bộ điều khiển.
Tôi đang sử dụng Moq 3.0.308.2. Bất kỳ ý tưởng về cách kiểm tra này sẽ được đánh giá cao. Cảm ơn!
Tôi đoán tôi không chắc chắn làm thế nào bạn sẽ stub này hoặc là (mặc dù tôi không biết nhiều về khai). Bạn có thể giải thích về cách mà có thể được xử lý? –
Ngoài ra, nhiều như tôi đồng ý với bạn về vấn đề ref, đó là cách lớp remoting của chúng tôi hoạt động và tôi ghét bắt đầu một tiền lệ của gói bit ngẫu nhiên của backend để tôi có thể viết các bài kiểm tra dễ dàng hơn. –
Tôi đã có một vấn đề tương tự, và có được như vậy zeroed trong ngày làm MoQ làm việc, tôi quên tôi có thể viết bài của riêng tôi! Cảm ơn bạn. –