尝试自学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?
答案 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的工作原理并不是您的代码可以正常工作。
你需要一个使用实现该接口的类的测试,因为你需要真正的代码来测试任何东西。
我要做的是:
你真的希望你的测试很有价值,并测试真正的功能,远离DI和IOC,保证无论如何都能正常工作。
有道理吗?您正在测试Cup类,而不仅仅是服务类,真正的类而不是它们的抽象,根据定义它们没有功能,因此无需测试。
想象一下当你有两个实现ICup的类时会发生什么。您将编写两个测试类,每个实现一个。
根据评论添加更多详情
您的测试更简单。
您需要做的就是测试一旦添加了一种成分,它实际上会出现在Cup对象的Ingredients列表中。这意味着您只需要测试Cup类,此时服务不会为您做任何事情。测试最简单的交互,一旦这些交互,你可以一步一步地转向更复杂的事情。
所以写下CupTests课程。测试当你添加一个实际上出现在成分列表中的成分时,检查错误和边界错误,比如当你尝试添加东西时,当成分列表为空时会发生什么。
根据你到目前为止所展示的内容,这就是你所需要的一切。
答案 2 :(得分:0)
container.RegisterSingleton<ICup>(standardCup)
在v5中已过时。
但是,您可以改用以下内容:
container.RegisterInstance<ICup>(standardCup);