2012-02-05 32 views
10

Phương thức ban đầu nó vẫn được gọi khi tôi cố gắng sử dụng Moq. Đây là mã của tôi:Cài đặt Moq không hoạt động, phương pháp gốc vẫn được gọi là

var mockedBetRepository = new Mock<BetRepository>(new FakeSiteContext()); 
mockedBetRepository.CallBase = true; 
Bet bet = new Bet(); 
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); 

betRepository = mockedBetRepository.Object; 

Sau đó trong code, betRepository.UpdateBet(bet) được gọi, nhưng không phải của phương pháp chế giễu của tôi mà được gọi là, thay vào đó, phương pháp của lớp được gọi là:

public virtual Bet UpdateBet(Bet betToUpdate) 
{ 
    siteContext.Entry(betToUpdate).State = System.Data.EntityState.Modified; 
    siteContext.SaveChanges(); 
    return betToUpdate; 
} 

Tại sao nó xảy ra điều này ?

Trả lời

8

Tôi đã tìm thấy sự cố.

Nếu tôi thay

Bet bet = new Bet(); 
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); 

với điều này

mockedBetRepository.Setup<Bet>(m => m.UpdateBet(It.IsAny<Bet>())).Returns((Bet b) => b); 

Sau đó nó hoạt động.

+0

Bạn có sử dụng cùng một tham chiếu khi bạn thiết lập phương pháp như bạn thực hiện khi nó thực sự được gọi không? Là như vậy sẽ giải thích các hành vi bạn đã nhìn thấy, như Moq có thể được sử dụng để kiểm tra các giá trị cụ thể đã được sử dụng khi xác minh. Đối với các loại tham chiếu, đó sẽ là các trường hợp cụ thể của đối tượng của bạn. – Andy

+0

Vâng, đó có lẽ là nó. Không biết các mocks đã rất độc quyền và rõ ràng. – ErikTJ

0

Cài đặt cơ sở cuộc gọi của bạn thành true, gọi cơ sở thực hiện thực tế của bạn.

+0

Có, nó sẽ gọi triển khai cơ sở "nếu không có thiết lập nào phù hợp", điều tôi có thể thấy, có gì? – ErikTJ

+0

@ErikTJ Và bạn đã thử nó mà không có CallBase = true? – Andy

+0

Tôi đã tìm thấy giải pháp, xem câu trả lời của tôi. Cũng thiết lập CallBase = false là không thể vì tôi chỉ cần giả lập một phương thức của nhiều. – ErikTJ

Các vấn đề liên quan