【问题标题】:Constructor with more than one instance of same type具有多个相同类型实例的构造函数
【发布时间】:2017-11-03 02:39:01
【问题描述】:

我有一个带有这样构造函数的类:

MyClass(MySetting, IMyService, IMyService, IMyService)

在这种情况下,如何使用 AutoFixture 创建MyClass?我知道当它只有一个IMyService 参数时,我们可以使用AutoMoqFreeze 一个模拟,但在这种情况下我不确定我们可以Freeze 三个模拟,因为我认为最后一个将被使用对于所有三个参数。

【问题讨论】:

    标签: c# unit-testing autofixture automoq


    【解决方案1】:

    确实,如果你Freeze 一个对象,你每次请求都会得到相同的对象;这就是Freeze 的意义所在。

    在这种情况下我通常会在课堂上加Inspection Properties,因为你写什么,你也可以暴露

    public class MyClass
    {
        public MyClass(
            MySetting setting,
            IMyService service1,
            IMyService service2,
            IMyService service3)
        {
            this.Service1 = service1;
            this.Service2 = service2;
            this.Service3 = service3;
        }
    
        public IMyService Service1 { get; }
        public IMyService Service2 { get; }
        public IMyService Service3 { get; }
    
        public string DoIt()
        {
            return
                this.Service1.Whatever() +
                this.Service2.Whatever() +
                this.Service3.Whatever();
        }
    }
    

    您可以使用Mock.Get 来获取每个注入服务的Mock,如本测试所示:

    [Fact]
    public void AskTheSut()
    {
        var fixture = new Fixture().Customize(new AutoMoqCustomization());
        var sut = fixture.Create<MyClass>();
        Mock.Get(sut.Service1).Setup(s => s.Whatever()).Returns("foo");
        Mock.Get(sut.Service2).Setup(s => s.Whatever()).Returns("bar");
        Mock.Get(sut.Service3).Setup(s => s.Whatever()).Returns("baz");
    
        var actual = sut.DoIt();
    
        Assert.Equal("foobarbaz", actual);
    }
    

    顺便说一句,作为设计原则,我会说一个依赖项很好,有时两个相同的依赖项也可以,但是如果您有三个,则应该考虑使用它们的集合。 (一个,两个,很多......

    【讨论】:

    • 谢谢,它解决了我的问题,Mock.Get 和服务暴露是关键。
    猜你喜欢
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多