1

私はMoqを学び始めましたが、この問題があります。HTTP GET および HTTP POST 要求を作成し、サーバー応答として HTML 文字列を返すモック クラス/インターフェイスが必要です。

コードを簡素化しました。ここは:

public interface IHttpManager
{
    /// <summary>
    /// Make HTTP GET request on server and return HTML string
    /// </summary>
    string HttpGet(Uri url, CookieContainer cookies, HttpRequestSettings settings);

    /// <summary>
    /// Make HTTP POST request and return HTML string
    /// </summary>
    string HttpPost(Uri url, string postData, CookieContainer cookies, HttpRequestSettings settings);
}

サーバーにログインまたはログオフするIHttpManagerクラスで使用します。ConnectionManager

public interface IConectionManager
{
    /// <summary>
    /// Connect to server and parse HTML response
    /// </summary>
    Result<T> LogIn(string nick, string password);

    /// <summary>
    /// Log off and parse HTML response
    /// </summary>
    /// <param name="account"></param>
    void LogOff(Acccount account);
}

public class ConnectionManager : IConectionManager
{
    private IHttpManager _httpManager;
    private HttpRequestSettings _httpRequestSettings;

    public ConnectionManager(IHttpManager httpManager, HttpRequestSettings httpRequestSettings)
    {
        _httpManager = httpManager;
        _httpRequestSettings = httpRequestSettings;
    }

    public Result<Account> LogIn(string nick, string password)
    {
        // I simplified this method

        // How correct mock IHttpManager, because it must return HTML string
        // so in Moq in Setup return hard coded HTML string which represent server response ?
        string htmlStringResponse = _httpManager.HttpGet(ServerUrl.LogOn, new CookieContainer(), _httpRequestSettings);

        // parse HTML string and return result
    }

    // ...
}

method の単体テストを行いLogInます。私は嘲笑したいと思いIHttpManagerます。しかし、私は正しい方法で行う方法がわかりません。

私はこれを試します:

// Arrange
var mockHttpManager = new Mock<IHttpManager>();

mockHttpManager.Setup(x=>x.HttpGet()).Returns(()=>"HTML SERVER RESPONSE");

var sut = new ConnectionManager(mockHttpManager.Object, new HttpRequestSettings());

// act
sut.Login("nick", "123")

// Assert
4

1 に答える 1

3

モックでパラメーターの期待値を設定する必要があるようです:

mockHttpManager
    .Setup(x => x.HttpGet(
        It.IsAny<Uri>(),
        It.IsAny<CookieContainer>(),
        It.IsAny<HttpRequestSettings>()))
    .Returns(() => "HTML SERVER RESPONSE");

理想的にはIt.Is<T>()、引数を一致させるために を使用して、メソッドが期待どおりのパラメーターで呼び出されるようにする必要があります。たとえば、Loginメソッドが次のように呼び出すことHttpGetをテストしたい場合がありServerUrl.LogOnます。

It.Is<Uri>(uri => uri == ServerUrl.LogOn),
于 2013-10-24T16:26:05.220 に答える