奇怪的Shim行为C#,除非在测试方法中实例化,否则不使用Shims

时间:2014-01-23 13:41:42

标签: c# .net shim

这应该是一个简单的(我是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 magic不起作用,它确实尝试解析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;
    }

它工作正常..所以在另一种方法中必定存在一些差异..但我当然看不到任何明显的东西。将在/如果我找到解决方案时更新

1 个答案:

答案 0 :(得分:3)

你唯一的一个垫片来自Create方法的字符串变体。您正在调用Url变体:

电流:

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

对于创建的网址变体:

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