Moq:设置不返回值的方法
我试图嘲笑调用存储库。我可以成功地做到这一点,当一个库调用通过设置()返回的值返回:Moq:设置不返回值的方法
mock.Setup(m => m.Get(param)).Returns(new CustomObject());
然而,当我尝试做同样设置为存储库调用,没有返回值,起订量抛出异常,并告诉我,这种方法从来没有所谓的模拟ieExpected调用正好是1倍,但0次
准确地说,我这样做:
mock.Setup(m => m.UpdateRepository(param1)); // UpdateRepository returns no value
service.DoUpdate(param1);
mock.Verify(m => m.UpdateRepository(param1), Times.Exactly(1));
注:DoUpdate方法只调用库。 UpdateRepository(参数1);
我在这种情况下没有正确使用Moq安装吗?有没有不同的方法来返回没有价值的安装方法?
在此先感谢!
尝试使用可验证:
mock.Setup(m => m.UpdateRepository(param1)).Verifiable();
我没看到mock.Expect通过Intellisense? (我正在使用Moq 4) – TeeZee 2012-02-07 17:09:16
@TeeZee尝试与设置 – 2012-02-07 17:17:41
你并不需要设置呼叫UpdateRepository。只需验证一下。
鉴于这些类型:
public interface IRepository
{
void UpdateRepository(string value);
}
public class Service
{
public Service(IRepository repository)
{
_repository = repository;
}
public void DoUpdate(string value)
{
_repository.UpdateRepository(value);
}
private IRepository _repository;
}
您的测试方法可能如下:
const string param1 = "whatever";
var repoMock = new Mock<IRepository>();
var sut = new Service(repoMock.Object);
sut.DoUpdate(param1);
repoMock.Verify(x => x.UpdateRepository(param1), Times.Once());
最佳答案IMO!在某些情况下,在调用之前使用Verify进行检查也可能是一个好主意,它从来没有被称为'Times.Never()'。这对确保只调用您的方法很有用。 – ForceMagic 2013-11-05 20:39:38
@ForceMagic Never()'可以是有用的;尽管对过于严格的嘲笑保持谨慎。您希望*地重构您的实现而不会破坏脆弱的测试。换句话说,只验证你正在测试的具体行为。 – TrueWill 2013-11-05 21:43:26
你肯定DoUpdate实际上是调用UpdateRepository? – 2012-02-07 01:17:32