1

我试图伪造一个 FtpWebRequest.GetResponse() 进行集成测试,但不使用服务器。我一直在尝试做的是简单地返回一个假的 FtpWebResponse 但是,您不能访问 FtpWebResponse 的构造函数,因为它是内部的。

这是我的代码:

生产代码:

            using (FtpWebResponse response = (FtpWebResponse) ftpWebRequest.GetResponse())
            {
                ftpResponse = new FtpResponse(response.StatusDescription, false);
            }

测试假我试图用来返回一个假的 FtpWebResponse:

            ShimFtpWebRequest.AllInstances.GetResponse = request =>
            {
                FtpWebResponse ftpWebResponse= new FtpWebResponse(/*parameters*/); // not allowed because it is internal
                ftpWebResponse.StatusDescription="blah blah blah";
                return ftpWebResponse;
            };

最后,我要做的就是返回一个假的 ftpWebResponse 以在我的测试中进行断言。有任何想法吗?谢谢

4

2 回答 2

1

找到了答案。如果您填充 FtpWebResponse,它将允许构造函数:

        FtpResponse response;

        using (ShimsContext.Create())
        {
            ShimFtpWebRequest.AllInstances.GetResponse = request => new ShimFtpWebResponse();
            ShimFtpWebResponse.AllInstances.StatusDescriptionGet = getDescritpion => "226 Transfer complete.";
            _ftpConnection.Put(_fileContent);
            response = new FtpResponse("226 Transfer complete.", false);
        }
        Assert.AreEqual(response.Message, "226 Transfer complete.");
        Assert.IsFalse(response.HasError);
于 2014-10-09T16:47:27.727 回答
0

Rhino 框架可以做到。它可以通过 Nuget 添加:

例子:

var ftpWebResponse = Rhino.Mocks.MockRepository.GenerateStub<FtpWebResponse>();
ftpWebResponse.Stub(f=>f.StatusCode).Return(FtpStatusCode.AccountNeeded);
于 2018-02-28T18:16:32.027 回答