Rhino Mocks AAA快速入门?
我一直在寻找有关使用Rhino Mocks 3.5+和AAA语法的一些不错的信息。 我发现很多博客都混合了旧的和新的东西,似乎更难以弄清楚如何使用它。
如果有一个像早期版本那样的Rhino Mocks AAA Cheat Sheet,那将会很棒。 您是否需要了解有关旧版Rhino的所有内容才能真正使用新版本? 我敢肯定,如果我是专家,我会喜欢Rhino的所有function,但现在我只是在游泳信息。 任何指针或良好的链接将完全赞赏!
我写了一个Rhino Mocks Arrange / Act / Assert(AAA)语法快速参考 。 它包含从Ayende的网站和其他几个博客收集的有关此语法样式的精简信息。
我假设您熟悉官方文档 ,我认为这非常好。 我的建议是尝试使用Rhino,当你遇到一些更具体的问题时,搜索SO或其他地方的解决方案。 我不认为有一个全面的犀牛嘲笑备忘单。 我想你会有更多的运气问“我怎么能用犀牛模拟做到这一点”
编辑:嗯,在定位AAA时,您不需要使用录制/播放。 AAA涉及三个步骤:
- 例如,安排 ,代表设置模拟类的行为
。
IOmicronDll mockWrapper = MockRepository.GenerateMock(); mockWrapper.Expect(wrapper => wrapper.Lock(1, ref errors)).OutRef(string.Empty).Return(true).Repeat.Any(); mockWrapper.Expect(wrapper => wrapper.Exec(1, "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any(); mockWrapper.Expect(wrapper => wrapper.Exec("1", "sys:cfg?(type)", ref output, ref errors)).OutRef("1,CMC 56,0;", "").Return(true).Repeat.Any(); Microsoft.Practices.Unity.UnityContainer c = new Microsoft.Practices.Unity.UnityContainer(); c.RegisterInstance (mockWrapper);
-
法案 ,代表执行测试
public Omicron(int deviceID) { try { if (g_Omicron == null) g_Omicron = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance
(); m_UniqueIdentifier = Guid.NewGuid(); m_Logger = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance (); m_ID = deviceID; GetConfiguration(); g_InstancesCount++; m_PollThread = new Thread(new ThreadStart(DoPoll)); m_PollThread.Start(); } -
和断言 ,代表非常结果
。
Assert.AreEqual("CMC 56", omicron.Type); mockWrapper.AssertWasCalled(wrapper => wrapper.Release(), options => options.Repeat.AtLeastOnce());
也许上面的例子不是最好的,但可能会让你进入正确的方向。
首先要确保你知道你对AAA中每个A的意思。 您可能知道,但我会将我的工作定义包含在答案的完整性中:
- 安排是我设置输入,模拟/存根,具有被测方法的对象的地方
- 法案是我称之为测试方法的地方
- 断言是我根据期望validation事情发生或不发生的地方
我喜欢在我的测试代码中添加注释,以提醒我考虑每一个问题。 一个例子可能有助于澄清:假设我有一个服务层类,它使用两个提供者层类,一个来自“旧”系统,另一个来自“新”系统; 我正在测试将旧东西复制到新系统的方法为每个找到的旧东西调用一次“CreateThing”方法。
[Test] public void Should_create_new_Thing_for_each_old_Thing() { // ----- // arrange // hardcode results from old system provider List oldThings = new List { ... }; // old system provider var oldProvider = MockRepository.GenerateStub(); oldProvider.Stub(m=>m.GetThings()).Return(oldThings); // new system provider var newProvider = MockRepository.GenerateStub(); // service object var svc = new MyService(oldProvider, newProvider); //----------- // act var result = svc.CopyThings(); //------------ // assert oldThings.ForEach(thing => newProvider.AssertWasCalled(prov => prov.CreateThing(thing))); }
你可能想要从Ayende在AAA上的原始post开始 ,而不是看看Ben Hall关于AAA的好文章 。 你可以使用其他答案中提到的所有完整参考资料……