通过Simple Injector

时间:2016-08-24 12:31:14

标签: c# simple-injector

尝试自学SimpleInjector并掌握基础知识但需要一些帮助。

基本上我想通过我已经填充的简单注入器而不是新对象传递对象。

我的案例如下:

ITeaService:

    public interface ICup
{
    string CupName { get; set; }
    List<string> Ingredients { get; set; }
}
public class Cup : ICup
{
    public string CupName { get; set; }
    public List<string> Ingredients { get; set; }

}
public interface ITeaService
{
    ICup GetTea();
}

TeaService:

    public class TeaService : ITeaService
{
    private ICup _cup;

    public TeaService(ICup cup)
    {
        _cup = cup;
    }

    public ICup GetTea()
    {

        this._cup.Ingredients.Add("Tea bag");
        this._cup.Ingredients.Add("Hot water");

        return this._cup;
    }
}

测试:

 var container = new SimpleInjector.Container();
        container.Register<ITeaService, TeaService>();
        container.Register<ICup, Cup>();

        container.Verify();
        // Act
        var cp = container.GetInstance<ICup>();
        cp.CupName = "Daniel";


        var teaService = container.GetInstance<ITeaService>();
        var cup = teaService.GetTea();

我是否想过如何通过预先定义的杯赛?变量cp是否我指定了CupName?

3 个答案:

答案 0 :(得分:3)

以下行不正确:

container.Register<ICup, Cup>();

每当请求Cup时,您都会告诉SimpleInjector创建新的ICup。将其更改为以下内容以始终返回相同的Cup

var standardCup = new Cup();
standardCup .CupName = "Daniel";
container.RegisterSingleton<ICup>(standardCup );

现在这个测试会成功:

var teaService = container.GetInstance<ITeaService>();
var cup = teaService.GetTea();
Assert.AreEqual(cup.CupName, "Daniel");
Assert.AreEqual(cup, standardCup);

编辑:基于评论:如果您总是想要一个新实例,但名称相同,则可以执行以下操作:

container.Register<ICup>(() => new Cup { CupName = "Daniel"});

每次请求Cup

时,这将运行回调以构建ICup

答案 1 :(得分:0)

第一个问题是你实际测试的是什么?

您编写测试的方式是您正在测试SimpleInjector的工作原理并不是您的代码可以正常工作。

你需要一个使用实现该接口的类的测试,因为你需要真正的代码来测试任何东西。

我要做的是:

  1. 创建一个实现ICup的Cup类 - 你可能已经拥有它了。
  2. 创建它的实例并将其传递给服务类的构造函数。
  3. 测试您期望的输出是corect。
  4. 你真的希望你的测试很有价值,并测试真正的功能,远离DI和IOC,保证无论如何都能正常工作。

    有道理吗?您正在测试Cup类,而不仅仅是服务类,真正的类而不是它们的抽象,根据定义它们没有功能,因此无需测试。

    想象一下当你有两个实现ICup的类时会发生什么。您将编写两个测试类,每个实现一个。

    根据评论添加更多详情

    您的测试更简单。

    您需要做的就是测试一旦添加了一种成分,它实际上会出现在Cup对象的Ingredients列表中。这意味着您只需要测试Cup类,此时服务不会为您做任何事情。测试最简单的交互,一旦这些交互,你可以一步一步地转向更复杂的事情。

    所以写下CupTests课程。测试当你添加一个实际上出现在成分列表中的成分时,检查错误和边界错误,比如当你尝试添加东西时,当成分列表为空时会发生什么。

    根据你到目前为止所展示的内容,这就是你所需要的一切。

答案 2 :(得分:0)

container.RegisterSingleton<ICup>(standardCup)在v5中已过时。

但是,您可以改用以下内容:

  container.RegisterInstance<ICup>(standardCup);