我一直在寻找有关使用Rhino Mocks 3.5+和AAA语法的一些不错的信息。我发现很多博客都混合了旧的和新的东西,似乎更难以弄清楚如何使用它。
如果有一个像早期版本那样的Rhino Mocks AAA Cheat Sheet,那将会很棒。您是否需要了解有关旧版Rhino的所有内容才能真正使用新版本?我敢肯定,如果我是专家,我会喜欢Rhino的所有功能,但现在我只是在游泳信息。任何指针或良好的链接将完全赞赏!
我一直在寻找有关使用Rhino Mocks 3.5+和AAA语法的一些不错的信息。我发现很多博客都混合了旧的和新的东西,似乎更难以弄清楚如何使用它。
如果有一个像早期版本那样的Rhino Mocks AAA Cheat Sheet,那将会很棒。您是否需要了解有关旧版Rhino的所有内容才能真正使用新版本?我敢肯定,如果我是专家,我会喜欢Rhino的所有功能,但现在我只是在游泳信息。任何指针或良好的链接将完全赞赏!
我写了一篇 Rhino Mocks Arrange / Act / Assert(AAA)语法快速参考。它包含有关从中收集的此语法样式的精简信息 Ayende的网站 和其他几个博客。
我写了一篇 Rhino Mocks Arrange / Act / Assert(AAA)语法快速参考。它包含有关从中收集的此语法样式的精简信息 Ayende的网站 和其他几个博客。
我假设你很熟悉 官方文件,在我看来这是相当不错的。 我的建议是尝试使用Rhino,当你遇到一些更具体的问题时,搜索SO或其他地方的解决方案。我不认为有一个全面的犀牛嘲笑备忘单。我想你会有更多的运气问“我怎么能用犀牛模拟做到这一点”
编辑: 那么,在定位AAA时,您不需要使用录制/播放。 AAA涉及三个步骤:
。
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);
法案,代表执行测试
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();
}
和 断言,代表非常 结果
。
Assert.AreEqual("CMC 56", omicron.Type);
mockWrapper.AssertWasCalled(wrapper => wrapper.Release(), options => options.Repeat.AtLeastOnce());
也许上面的例子不是最好的,但可能会让你进入正确的方向。
首先要确保你知道你对AAA中每个A的意思。您可能知道,但我会将我的工作定义包含在答案的完整性中:
我喜欢在我的测试代码中添加注释,以提醒我考虑每一个问题。一个例子可能有助于澄清:假设我有一个服务层类,它使用两个提供者层类,一个来自“旧”系统,另一个来自“新”系统;我正在测试将旧东西复制到新系统的方法为每个找到的旧东西调用一次“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)));
}
你可能想要开始 Ayende在AAA上的原始帖子,而不是看看 Ben Hall关于AAA的好文章。你可以使用其他答案中提到的所有完整参考资料......