0

这应该是一个简单的(我是 Shimming 的新手..)

        using(ShimsContext.Create())
        {
            ShimHttpWebRequest.Constructor = @this =>
            {
                var shim = new ShimHttpWebRequest(@this);
                shim.GetResponse = () =>
                {
                    return new ShimHttpWebResponse();
                };
            };

            ShimWebRequest.CreateString = (url) =>
            {
                return new ShimHttpWebRequest();
            };

            var http = WebRequest.Create("http://moomoo.moomoo") as HttpWebRequest;
            var r = http.GetResponse() as HttpWebResponse;
        }

因此,如果没有垫片,此测试将失败,因为没有这样的 url,它将无法解决。使用垫片可以正常工作。问题是,如果然后创建我想要测试的类并调用以相同方式创建 HttpWebRequest 的方法,那么 shim 魔法似乎不起作用,它真的试图解析 url。我之前用 SmtpClient 做过一个类似的测试,这很有效,所以我真的不明白为什么我的方法创建这些对象的行为应该有任何不同。

对此有任何想法/经验吗?

更新 1

我班上的代码:

    public void METHODNAME()
    {
        try
        {
            // Request the login page
            Uri url = new Uri(BaseUrl + "logon.aspx");
            HttpWebRequest request = WebRequest.Create(url) as HttpWebRequest;
            request.Method = "GET";
            request.AllowAutoRedirect = false;
            request.CookieContainer = Cookies;
            // Exception raised below
            HttpWebResponse response = request.GetResponse() as HttpWebResponse;
    etc....

所以这是一个非常基本的方法

更新 2

刚刚将它添加到我正在测试的类中:

    public void test()
    {

        var http = WebRequest.Create("http://moomoo.moomoo") as HttpWebRequest;
        var r = http.GetResponse() as HttpWebResponse;
    }

它工作正常..所以其他方法肯定有一些区别..但我当然看不到任何明显的东西。将在/如果我找到解决方案时更新

4

1 回答 1

3

您只为 from Create 方法的字符串变体制作了垫片。您正在调用 Url 变体:

当前的:

ShimWebRequest.CreateString = (url) =>
        {
            return new ShimHttpWebRequest();
        };

对于 Create 的 Url 变体:

ShimWebRequest.CreateUrl = (url) =>
        {
            return new ShimHttpWebRequest();
        };
于 2014-01-23T14:15:49.817 回答