Moq:设置不返回值的方法

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安装吗?有没有不同的方法来返回没有价值的安装方法?

在此先感谢!

+1

你肯定DoUpdate实际上是调用UpdateRepository? – 2012-02-07 01:17:32

尝试使用可验证:

mock.Setup(m => m.UpdateRepository(param1)).Verifiable(); 
+0

我没看到mock.Expect通过Intellisense? (我正在使用Moq 4) – TeeZee 2012-02-07 17:09:16

+0

@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()); 
+0

最佳答案IMO!在某些情况下,在调用之前使用Verify进行检查也可能是一个好主意,它从来没有被称为'Times.Never()'。这对确保只调用您的方法很有用。 – ForceMagic 2013-11-05 20:39:38

+0

@ForceMagic Never()'可以是有用的;尽管对过于严格的嘲笑保持谨慎。您希望*地重构您的实现而不会破坏脆弱的测试。换句话说,只验证你正在测试的具体行为。 – TrueWill 2013-11-05 21:43:26