如何使用JustMock Lite模拟外部依赖项

时间:2017-01-23 11:48:44

标签: c# unit-testing justmock

我使用JustMock的免费版本来模拟一些外部依赖项,例如GetUserSettingsResponse这是一个密封类。问题是免费版本不允许我们模拟密封的类。由于某些原因,我无法使用完整版。以下是我的代码示例:

public GetUserSettingsResponse GetUserSettingsResponse(string emailAddress)
{
    var response = service.GetUserSettings(
        emailAddress,
        UserSettingName.ExternalEwsUrl,
        UserSettingName.InternalEwsUrl,
        UserSettingName.EwsSupportedSchemas);
        return response;
}

这是我试图模仿的方法,如下所示:

[TestMethod]
public void GetExchangeService()
{
    //Arrange            
    string url = "";
    GetUserSettingsResponse response;
    ObjectOfMyClass.Arrange(x => x.GetUserSettingsResponse(Arg.IsAny<string>())).Returns(new GetUserSettingsResponse()); //this is where it throws exception saying that only non-sealed classes can be mocked with lite version of just mock

}

编辑:我的应用程序是一个Web服务,它基本上使用EWS托管API从Exchange服务器获取电子邮件帐户详细信息。因此,为了开始通信,我首先进行AutoDiscovery以获取用户的电子邮件地址的url。因此,受测试的主题是在内部调用GetUserSettingsResponse方法的方法:

public class MyClass
{
    public ExchangeService GetExchangeService(
                string userName,
                string password,
                int version,
                string emailAddress,
                string userId)
    {
        AutoDiscoverService service = new AutodiscoverService();
        service.UseDefaultCredentials = false;
        service.Credentials = new NetworkCredential(userName, password);
        service.EnableScpLookup = true;

        service.ReturnClientRequestId = true;

        service.PreAuthenticate = false;

        service.RedirectionUrlValidationCallback = RedirectionUrlValidationCallback;

        var url = string.Empty;
        var response = GetUserSettingsResponse(emailAddress);
        if (response.TryGetSettingValue(UserSettingName.ExternalEwsUrl, out settingValue)
            || response.TryGetSettingValue(UserSettingName.InternalEwsUrl, out settingValue))
        {
            ewsurl = settingValue;
        }
        var exchangeService = new ExchangeService((ExchangeVersion)version)
                                      {
                                          Credentials = new WebCredentials(userName, password),
                                          KeepAlive = true,
                                          Url = new Uri(ewsurl)
                                      };
        return exchangeService;
    }
}

0 个答案:

没有答案