相关疑难解决方法(0)

是否可以模拟.NET HttpWebResponse?

我有一个集成测试,从第三方服务器获取一些json结果.它非常简单,效果很好.

我希望停止实际点击这个服务器并使用Moq(或任何Mocking库,如ninject等)来劫持并强制返回结果.

这可能吗?

以下是一些示例代码: -

public Foo GoGetSomeJsonForMePleaseKThxBai()
{
    // prep stuff ...

    // Now get json please.
    HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("Http://some.fancypants.site/api/hiThere);
    httpWebRequest.Method = WebRequestMethods.Http.Get;

    string responseText;

    using (var httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse())
    {
        using (var streamReader = new StreamReader(httpWebResponse.GetResponseStream()))
        {
            json = streamReader.ReadToEnd().ToLowerInvariant();
        }
    }

    // Check the value of the json... etc..
}
Run Code Online (Sandbox Code Playgroud)

当然,这个方法是从我的测试中调用的.

我在想,也许我需要传递给这个方法(或类的属性?)一个嘲笑httpWebResponse或者什么,但是不太确定这是不是这样.此外,响应是httpWebRequest.GetResponse()方法的输出..所以也许我只需要传入一个模拟HttpWebRequest

任何带有示例代码的建议都会得到最多的评价!

.net c# unit-testing moq mocking

63
推荐指数
4
解决办法
4万
查看次数

如何模拟非虚拟方法?

[TestMethod]
public void TestMethod1()
{
    var mock = new Mock<EmailService>();
    mock.Setup(x => x.SendEmail()).Returns(true);
    var cus = new Customer();
    var result = cus.AddCustomer(mock.Object);
    Assert.IsTrue(result);
}

public class Customer
{
    public bool AddCustomer(EmailService emailService)
    {
        emailService.SendEmail();
        Debug.WriteLine("new customer added");
        return true;
    }
}

public class EmailService
{            
    public virtual bool SendEmail()
    {
        throw  new Exception("send email failed cuz bla bla bla");
    }
}
Run Code Online (Sandbox Code Playgroud)

EmailService.SendEmail方法必须是虚拟的才能模拟它.有没有办法模拟非虚拟方法?

.net c# moq

32
推荐指数
4
解决办法
3万
查看次数

标签 统计

.net ×2

c# ×2

moq ×2

mocking ×1

unit-testing ×1