2009-11-24 44 views
10

Tôi cần giúp đỡ với một testmethod im cố gắng để viết ...Tại sao phương thức Moq-mocked trả về null?

Tôi cần phải kiểm tra xem người dùng có thể hiển thị hồ sơ của mình không, tuy nhiên tôi gặp lỗi khi tôi cố gắng sử dụng phương pháp GetProfileFromUserName giả của tôi. Các phương thức trả về null. Những gì tôi không hiểu là tôi có một phương pháp tương tự có tên GetEmail, mà về cơ bản không giống nhau và hoạt động.

Đây là mã để lấy hồ sơ cá nhân, mà không làm việc:

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName)).Returns(new Profile { ProfileID = userProfile.ProfileID }); 

Và đây là đoạn code để lấy email, mà làm việc.

mockUserRepository.Setup(em => em.GetEmail(new MockIdentity("JohnDoe").Name)).Returns("[email protected]"); 

Và đây là một đoạn của phương pháp các cuộc gọi giả và trở thành vô giá trị trên thay vì một hồ sơ cá nhân:

public ActionResult ShowProfile() 
    { 
     var profile = _userRepository.GetProfileFromUserName(User.Identity.Name); 

am i làm gì sai? Nếu tôi thay thế userProfile.UserName trong GetProfileFromUserName thành It.IsAny();

+0

Điều gì sẽ xảy ra nếu bạn sử dụng 'It.IsAny ()'? –

Trả lời

11

Nếu trả về giá trị rỗng, điều đó có nghĩa là Setup của bạn không khớp với cuộc gọi thực tế. Kiểm tra xem userProfile.UserName có chứa giá trị chính xác tại dòng Thiết lập hay không.

Ngoài ra, để phát hiện các cuộc gọi chưa từng có, hãy tạo mockUserRepository của bạn với tùy chọn MockBehavior.Strict.

Hy vọng điều này sẽ hữu ích.

+0

Nó xảy ra với tôi rằng tôi đã sử dụng một nhà điều hành diễn viên tiềm ẩn nên phương pháp được biên dịch nhưng moq không khớp với cuộc gọi. –

0

Đối với bất cứ ai đang cố gắng để trả lại một đối tượng, điều đó không tồn tại ở thời điểm thiết lập thử nghiệm ("Sắp xếp"), giải pháp là sử dụng các đại biểu (Func <>) quá tải:

mockUserRepository.Setup(gp => gp.GetProfileFromUserName(userProfile.UserName)) 
    .Returns(() => new Profile { ProfileID = userProfile.ProfileID }); 
Các vấn đề liên quan