C# Moq设置不工作,仍调用原始方法

C# Moq设置不工作,仍调用原始方法,c#,mocking,moq,C#,Mocking,Moq,当我尝试使用Moq时,它仍然调用原始方法。这是我的密码: var mockedBetRepository = new Mock<BetRepository>(new FakeSiteContext()); mockedBetRepository.CallBase = true; Bet bet = new Bet(); mockedBetRepository.Setup<Bet>(m => m.UpdateBet(bet)).Returns(bet); betRe

当我尝试使用Moq时,它仍然调用原始方法。这是我的密码:

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;

为什么会发生这种情况?

您将callbase设置为true,这将调用您的实际实现。

我发现了问题所在

如果我替换

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

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

然后它就会工作。

是的,它会调用基本实现“如果没有匹配的设置”,我可以看到,这是存在的?@ErikTJ,您在没有CallBase=true的情况下尝试过它吗?我找到了解决方案,请看我的答案。设置CallBase=false也是不可能的,因为我只需要模拟许多方法中的一个。@ErikTJ您问“为什么会发生这种情况”,我解释了为什么会发生这种情况。我不是建议您将CallBase设置为false。您在设置方法时使用的引用是否与实际调用方法时使用的引用相同?这可以解释你看到的行为,因为Moq可以用来测试验证时使用的特定值。对于引用类型,这将是对象的特定实例。是的,可能就是这样。我不知道mock是如此的排他性和明确。为什么我们应该使用它。IsAny()而不是编写方法。
mockedBetRepository.Setup<Bet>(m => m.UpdateBet(It.IsAny<Bet>())).Returns((Bet b) => b);