1

I have a class that manipulates dependencies based on other dependency results:

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");
        }
    }

I think I can dummy the validation factories and the byte factory to create a response but how do I test that the method in the dependency got called. This IS an orchestration type class.

Chris Hayes
  • 3,876
  • 7
  • 42
  • 72
  • So you want to validate that OnPageLoad gets called? – Darek May 06 '15 at 16:38
  • i want to test multiple cases where each validation performs the correct action – Chris Hayes May 06 '15 at 16:38
  • if a querystringvalidator returns false I want to know the view redirect gets called, if the servicepackagevalidator returns false the view write gets called and else the binar write gets called – Chris Hayes May 06 '15 at 16:40
  • 1
    I see, so you need a Moq and Verifiable: http://stackoverflow.com/questions/347818/using-moq-to-determine-if-a-method-is-called – Darek May 06 '15 at 16:44
  • http://blog.ploeh.dk/2013/10/23/mocks-for-commands-stubs-for-queries – Mark Seemann May 06 '15 at 19:45

1 Answers1

1

using Moq and 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"));
        });
    }

}
Chris Hayes
  • 3,876
  • 7
  • 42
  • 72