C# 如何测试依赖关系交互

C# 如何测试依赖关系交互,c#,dependency-injection,mocking,tdd,C#,Dependency Injection,Mocking,Tdd,我有一个类,它根据其他依赖项结果来处理依赖项: public class PdfPagePresenter : IPdfPagePresenter { private readonly IPdfPageView _view; private readonly IPdfPageVisitor<bool> _querystringvalidator; private readonly IPdfPageVisitor<bool&

我有一个类,它根据其他依赖项结果来处理依赖项:

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");
        }
    }
公共类PdfPagePresenter:IPdfPagePresenter
{
私有只读IPdfPageView\u视图;
私有只读IPdfPageVisitor\u查询字符串验证程序;
私有只读IPdfPageVisitor\u servicepackagevalidator;
私有只读IPdfPageVisitor\u水印生成器;
公共PdfPagePresenter(IPdfPageView视图、IPdfPageVisitorAbstractFactory访问者AbstractFactory)
{
_视图=视图;
_querystringvalidator=visitorAbstractFactory.QueryStringValidatorFactory().Invoke();
_servicepackagevalidator=visitorAbstractFactory.ServicePackageValidatorFactory().Invoke();
_watermarkgenerator=visitorAbstractFactory.WatermarkStreamGeneratorFactory().Invoke();
}
公共void OnPageLoad()
{
if(!\u view.Accept(\u querystringvalidator))
{
_view.RespondRedirect(“Somepage.aspx”);
返回;
}
如果(!\u查看.接受(\u servicepackagevalidator))
{
_view.RespondWrite(“在我们的系统中找不到服务包”);
返回;
}
_view.RespondBinaryWrite(_view.Accept(_watermarkgenerator),“application/pdf”);
}
}
我想我可以模拟验证工厂和字节工厂来创建响应,但是如何测试依赖项中的方法是否被调用。这是一个编排类型类。

使用Moq和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"));
        });
    }

}
[TestFixture]
公共类TestPdfPagePresenter
{
[测试]
public void testOnPageLoadInvalidQueryStringRunsDirect()公共无效
{
var qstringval=new Mock();
var spackageval=new Mock();
var watermarkgen=new Mock();
var fac=new Mock();
fac.Setup(f=>f.QueryStringValidatorFactory())。返回(()=>qstringval.Object);
fac.Setup(f=>f.ServicePackageValidatorFactory())。返回(()=>spackageval.Object);
fac.Setup(f=>f.WatermarkStreamGeneratorFactory())。返回(()=>watermarkgen.Object);
var view=newmock();
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(新字节[0]);
Assert.DoesNotThrow(()=>
{
var presenter=新的PdfPagePresenter(view.Object、fac.Object);
OnPageLoad();
view.Verify(v=>v.RespondRedirect(“Somepage.aspx”);
view.Verify(v=>v.RespondWrite(“在我们的系统中找不到服务包”)、Times.Never);
view.Verify(v=>v.RespondBinaryWrite(watermarkgen.Object.Result(),“application/pdf”),Times.Never;
});
}
[测试]
public void TestOnPageLoadInvalidServicePackageRunsWrite()的测试
{
var qstringval=new Mock();
var spackageval=new Mock();
var watermarkgen=new Mock();
var fac=new Mock();
fac.Setup(f=>f.QueryStringValidatorFactory())。返回(()=>qstringval.Object);
fac.Setup(f=>f.ServicePackageValidatorFactory())。返回(()=>spackageval.Object);
fac.Setup(f=>f.WatermarkStreamGeneratorFactory())。返回(()=>watermarkgen.Object);
var view=newmock();
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(新字节[0]);
Assert.DoesNotThrow(()=>
{
var presenter=新的PdfPagePresenter(view.Object、fac.Object);
OnPageLoad();
view.Verify(v=>v.RespondRedirect(“Somepage.aspx”),Times.Never);
view.Verify(v=>v.RespondWrite(“在我们的系统中找不到服务包”);
view.Verify(v=>v.RespondBinaryWrite(watermarkgen.Object.Result(),“application/pdf”),Times.Never;
});
}
[测试]
public void TestOnPageLoadValidRunsBinaryWrite()
{
var qstringval=new Mock();
var spackageval=new Mock();
var watermarkgen=new Mock();
var fac=new Mock();
fac.Setup(f=>f.QueryStringValidatorFactory())。返回(()=>qstringval.Object);
fac.Setup(f=>f.ServicePackageValidatorFactory())。返回(()=>spackageval.Object);
fac.Setup(f=>f.WatermarkStreamGeneratorFactory())。返回(()=>watermarkgen.Object);
var returnbytes=新字节[0];
var view=newmock();
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=新的PdfPagePresenter(view.Object、fac.Object);
OnPageLoad();
view.Verify(v=>v.RespondRedirect(“Somepage.aspx”),Times.Never);
view.Verify(v=>v.RespondWrite(“在我们的系统中找不到服务包”)、Times.Never);
view.Verify(v=>v.RespondBinaryWrite(returnbytes,“application/pdf”);
});
}
}

那么您想验证是否调用了OnPageLoad?我想测试多个案例,其中每个验证都执行正确的操作如果querystringvalidator返回false,我想知道调用了视图重定向,如果servicepackagevalidator返回false,则调用视图写入,否则调用二进制写入。请参见,因此,您需要最低起订量和可验证的: