用于单元测试的假HttpContext.Current.Server.MapPath

时间:2015-09-28 16:22:09

标签: c# unit-testing httpcontext

我的测试在这一行上失败了。我已经发现这是因为HttpContext方法中的GetProofOfPurchase。以下是我失败的一句话:

var image = Image.GetInstance(HttpContext.Current.Server.MapPath(GlobalConfig.HeaderLogo));

这是我的测试:

 [Test]
    public void GetProofOfPurchase_Should_Call_Get_On_ProofOfPurchaseRepository()
    {
        string customerNumber = "12345";
        string orderNumber = "12345";
        string publicItemNumber = "12345";

    var result = new ProofOfPurchase();
    this.proofOfPurchaseRepository.Expect(p => p.Get(new KeyValuePair<string,string>[0])).IgnoreArguments().Return(result);
    this.promotionTrackerService.GetProofOfPurchase(customerNumber, orderNumber, publicItemNumber);
    this.promotionTrackerRepository.VerifyAllExpectations();
}

promotionTrackerService.GetProofOfPurchase行的测试失败。在这种情况下如何伪造HttpContext?我已经搜索了Stack Overflow以寻找与我类似的问题,但是我无法获得任何工作。

我试过这样做:

var image = Image.GetInstance(Path.Combine(AppDomain.CurrentDomain.BaseDirectory, GlobalConfig.HeaderLogo));

但它没有说:

  

System.Net.WebException:找不到路径的一部分&#39; C:\ Images \ HeaderLogo.png&#39;。

根据我在Stack Overflow上阅读的内容,如果我计划对其进行单元测试,我就不应该使用HttpContext.Current,这就是我尝试使用Path.Combine的原因,但我和#39; m无法让它正常工作。

有人可以提供一些指导,让我们需要做些什么来让这个单元测试起作用吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

在编写涉及non-pure函数的代码的测试时,我更喜欢做的是隐藏它们,在最简单的情况下,是隐藏的Func<string, string>

class PromotionTrackerService
{
    private readonly Func<string, string> imageMapper;

    public PromotionTrackerService(Func<string, string> imageMapper)
    {
        this.imageMapper = imageMapper ?? HttpContext.Current.Server.MapPath;
    }

    public void GetProofOfPurchase()
    {
        var image = Image.GetInstance(imageMapper(GlobalConfig.HeaderLogo));
    }
}

现在,您的测试看起来不像单元测试 - 它更像是一个集成测试,具有所有文件访问权限。