【问题标题】:How do you test dependency interaction你如何测试依赖交互
【发布时间】:2015-07-16 22:25:45
【问题描述】:

我有一个根据其他依赖结果来操作依赖的类:

public class PdfPagePresenter : IPdfPagePresenter
    {
        private readonly IPdfPageView _view;
        private readonly IPdfPageVisitor<bool> _querystringvalidator;
        private readonly IPdfPageVisitor<bool> _servicepackagevalidator;
        private readonly IPdfPageVisitor<byte[]> _watermarkgenerator;

        public PdfPagePresenter(IPdfPageView view, IPdfPageVisitorAbstractFactory visitorAbstractFactory)
        {
            _view = view;
            _querystringvalidator = visitorAbstractFactory.QueryStringValidatorFactory().Invoke();
            _servicepackagevalidator = visitorAbstractFactory.ServicePackageValidatorFactory().Invoke();
            _watermarkgenerator = visitorAbstractFactory.WatermarkStreamGeneratorFactory().Invoke();
        }

        public void OnPageLoad()
        {

            if (!_view.Accept(_querystringvalidator))
            {
                _view.RespondRedirect("Somepage.aspx");
                return;
            }

            if (!_view.Accept(_servicepackagevalidator))
            {
                _view.RespondWrite("Cannot find the service package in our system.");
                return;
            }

            _view.RespondBinaryWrite(_view.Accept(_watermarkgenerator), "application/pdf");
        }
    }

我想我可以模拟验证工厂和字节工厂来创建响应,但是我如何测试依赖项中的方法是否被调用。这是一个编排类型类。

【问题讨论】:

标签: c# dependency-injection mocking tdd


【解决方案1】:

使用最小起订量和 nUnit

[TestFixture]
public class TestPdfPagePresenter
{
    [Test]
    public void TestOnPageLoadInvalidQuerystringRunsRedirect()
    {
        var qstringval = new Mock<IPdfPageVisitor<bool>>();
        var spackageval = new Mock<IPdfPageVisitor<bool>>();
        var watermarkgen = new Mock<IPdfPageVisitor<byte[]>>();

        var fac = new Mock<IPdfPageVisitorAbstractFactory>();
        fac.Setup(f => f.QueryStringValidatorFactory()).Returns(() => qstringval.Object);
        fac.Setup(f => f.ServicePackageValidatorFactory()).Returns(() => spackageval.Object);
        fac.Setup(f => f.WatermarkStreamGeneratorFactory()).Returns(() => watermarkgen.Object);


        var view = new Mock<IPdfPageView>();
        view.Setup(v => v.Accept(qstringval.Object)).Returns(false);
        view.Setup(v => v.Accept(spackageval.Object)).Returns(true);
        view.Setup(v => v.Accept(watermarkgen.Object)).Returns(new byte[0]);

        Assert.DoesNotThrow(() =>
        {
            var presenter = new PdfPagePresenter(view.Object, fac.Object);
            presenter.OnPageLoad();
            view.Verify(v => v.RespondRedirect("Somepage.aspx"));
            view.Verify(v => v.RespondWrite("Cannot find the service package in our system."), Times.Never);
            view.Verify(v => v.RespondBinaryWrite(watermarkgen.Object.Result(), "application/pdf"), Times.Never);
        });
    }

    [Test]
    public void TestOnPageLoadInvalidServicePackageRunsWrite()
    {
        var qstringval = new Mock<IPdfPageVisitor<bool>>();
        var spackageval = new Mock<IPdfPageVisitor<bool>>();
        var watermarkgen = new Mock<IPdfPageVisitor<byte[]>>();

        var fac = new Mock<IPdfPageVisitorAbstractFactory>();
        fac.Setup(f => f.QueryStringValidatorFactory()).Returns(() => qstringval.Object);
        fac.Setup(f => f.ServicePackageValidatorFactory()).Returns(() => spackageval.Object);
        fac.Setup(f => f.WatermarkStreamGeneratorFactory()).Returns(() => watermarkgen.Object);


        var view = new Mock<IPdfPageView>();
        view.Setup(v => v.Accept(qstringval.Object)).Returns(true);
        view.Setup(v => v.Accept(spackageval.Object)).Returns(false);
        view.Setup(v => v.Accept(watermarkgen.Object)).Returns(new byte[0]);

        Assert.DoesNotThrow(() =>
        {
            var presenter = new PdfPagePresenter(view.Object, fac.Object);
            presenter.OnPageLoad();
            view.Verify(v => v.RespondRedirect("Somepage.aspx"), Times.Never);
            view.Verify(v => v.RespondWrite("Cannot find the service package in our system."));
            view.Verify(v => v.RespondBinaryWrite(watermarkgen.Object.Result(), "application/pdf"), Times.Never);
        });
    }

    [Test]
    public void TestOnPageLoadValidRunsBinaryWrite()
    {
        var qstringval = new Mock<IPdfPageVisitor<bool>>();
        var spackageval = new Mock<IPdfPageVisitor<bool>>();
        var watermarkgen = new Mock<IPdfPageVisitor<byte[]>>();

        var fac = new Mock<IPdfPageVisitorAbstractFactory>();
        fac.Setup(f => f.QueryStringValidatorFactory()).Returns(() => qstringval.Object);
        fac.Setup(f => f.ServicePackageValidatorFactory()).Returns(() => spackageval.Object);
        fac.Setup(f => f.WatermarkStreamGeneratorFactory()).Returns(() => watermarkgen.Object);

        var returnbytes = new byte[0];
        var view = new Mock<IPdfPageView>();
        view.Setup(v => v.Accept(qstringval.Object)).Returns(true);
        view.Setup(v => v.Accept(spackageval.Object)).Returns(true);
        view.Setup(v => v.Accept(watermarkgen.Object)).Returns(returnbytes);

        Assert.DoesNotThrow(() =>
        {
            var presenter = new PdfPagePresenter(view.Object, fac.Object);
            presenter.OnPageLoad();
            view.Verify(v => v.RespondRedirect("Somepage.aspx"), Times.Never);
            view.Verify(v => v.RespondWrite("Cannot find the service package in our system."), Times.Never);
            view.Verify(v => v.RespondBinaryWrite(returnbytes, "application/pdf"));
        });
    }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-28
    • 2012-03-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-09-17
    • 2011-04-09
    • 1970-01-01
    相关资源
    最近更新 更多