11

我一直在寻找一些关于使用带有 AAA 语法的 Rhino Mocks 3.5+ 的体面信息。我发现很多博客混合了新旧事物,这似乎使弄清楚如何使用它变得更加困难。

如果有像早期版本那样的 Rhino Mocks AAA 备忘单,那就太好了。是否需要您了解有关旧版本 Rhino 的所有信息才能实际使用新版本?我敢肯定,如果我是专家,我会喜欢 Rhino 的所有功能,但现在我只是在信息中游泳。任何指针或良好的链接将不胜感激!

4

4 回答 4

13

我写了一个Rhino Mocks Arrange / Act / Assert (AAA) Syntax Quick Reference它包含从Ayende 的网站 和其他几个博客 收集的有关这种语法风格的浓缩信息。

于 2011-03-28T21:19:23.763 回答
1

首先确保您知道 AAA 中每个 A 的含义。您可能知道,但我将包括我的工作定义以确保答案的完整性:

  • 安排是我设置输入、模拟/存根、带有被测方法的对象的地方
  • Act是我调用被测方法的地方
  • 断言是我根据预期验证事情发生或未发生的地方

我喜欢在我的测试代码中添加注释来提醒我思考这些事情。一个例子可能有助于澄清:假设我有一个服务层类,它使用两个提供者层类,一个来自“旧”系统,一个来自“新”系统;我正在测试将旧事物复制到新系统的方法为找到的每个旧事物调用一次“CreateThing”方法。

[Test]
public void Should_create_new_Thing_for_each_old_Thing()
{
  // -----
  // arrange

  // hardcode results from old system provider
  List<Thing> oldThings = new List<Thing> { ... };

  // old system provider
  var oldProvider = MockRepository.GenerateStub<IOldSystemProvider>();
  oldProvider.Stub(m=>m.GetThings()).Return(oldThings);

  // new system provider
  var newProvider = MockRepository.GenerateStub<INewSystemProvider>();

  // service object
  var svc = new MyService(oldProvider, newProvider);

  //-----------
  // act
  var result = svc.CopyThings();

  //------------
  // assert
  oldThings.ForEach(thing => 
                    newProvider.AssertWasCalled(prov => prov.CreateThing(thing)));
}
于 2010-07-12T17:48:58.743 回答
1

I assume that you're familiar with official documentation, which is quite good in my opinion. My suggestion is to try to use Rhino, and when you encounter some more specific problem search for solution wither on SO or somewhere else. I don't think that there is a comprehensive cheat sheet for Rhino mocks. I guess you'll have more luck asking "How can I do this and that using Rhino Mocks"

Edit: Well, you don't need to use Record/Playback when targeting AAA. There are three steps involved in AAA:

  • Arrange, which stands for setting up the behavior of mocked class, for example

.

IOmicronDll mockWrapper = MockRepository.GenerateMock<IOmicronDll>();
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<IOmicronDll>(mockWrapper);
  • Act, which stands for executing the tests

    public Omicron(int deviceID)
    {
        try
        {
            if (g_Omicron == null)
                g_Omicron = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<CMEngineWrapper.IOmicronDll>();
            m_UniqueIdentifier = Guid.NewGuid();
            m_Logger = Microsoft.Practices.ServiceLocation.ServiceLocator.Current.GetInstance<AdvAdmittance.Framework.ILogger>();
            m_ID = deviceID;
            GetConfiguration();
            g_InstancesCount++;
            m_PollThread = new Thread(new ThreadStart(DoPoll));
            m_PollThread.Start();
        }
    
  • And Assert, which stands for veryfing the results

.

Assert.AreEqual("CMC 56", omicron.Type);
mockWrapper.AssertWasCalled(wrapper => wrapper.Release(), options => options.Repeat.AtLeastOnce());

Perhaps the above examples aren't the best, but might get you into right direction.

于 2010-01-25T08:29:58.847 回答
1

您可能希望从Ayende 关于 AAA 的原始帖子开始,而不是查看Ben Hall 关于 AAA 的精彩博客文章。比您可以使用其他答案中提到的所有完整参考资料...

于 2011-09-22T20:23:23.767 回答