1

我正在创建一个模拟和一个存根。存根是以下合约:

public interface IMailService
{
   void SetCredentials(ICredentials credentials);
   bool Connect();
}

我的断言如下:“将正确的凭据传递给 IMailService,将成功连接”。所以我创建了我的模拟对象:

var mockAdapter = new Mock<IMailService>();

现在我应该准备这个适配器。如果使用正确的凭据调用 SetCredentials 方法,则 Connect() 方法应返回 true。否则它将返回false。

我只是不确定如何使用 Moq 设置此行为。

4

1 回答 1

1

您需要 2 个测试来涵盖这一点,一个是Connect返回true,另一个是返回false

[Fact] // or [Test] depending on your testing framework
public void MailServiceConnectsIfCredentialsAreValid()
{
    var mockMailService = new Mock<IMailService>();
    mockMailService.Setup(x => x.Connect()).Returns(true);

    // The rest of your code which will use the mockMailService.Object...
}

[Fact]
public void MailServiceFailsToConnectIfCredentialsAreInvalid()
{
    var mockMailService = new Mock<IMailService>();
    mockMailService.Setup(x => x.Connect()).Returns(false);

    // The rest of your code which will use the mockMailService.Object...
}

出于测试的目的,您并不关心ICredentials通过了什么。您只是涵盖了两种可能性,IMailService.Connect()即它返回truefalse。确定会发生什么的实际逻辑将存在于您的实际实现的测试中IMailService

您也可能会废弃该SetCredentials方法,然后将其传递ICredentialsConnect.

bool Connect(ICredentials credentials);
于 2012-12-17T10:19:40.663 回答