【问题标题】:Rhino Mocks Why Can't I Mock a Property?Rhino 模拟 为什么我不能模拟一个属性?
【发布时间】:2012-09-14 23:43:04
【问题描述】:

我花了几天时间编写测试,然后不得不在最后一刻添加一个属性来解决我在编写测试时发现的一个问题。自从添加该属性后,我一直在试图让模拟框架发挥作用。

这是我的代码。

using (_mockRepository.Record())
        {
            _mockBattleDao.Expect(b => b.GetUnprocessedActions(gameId, round)).Return(roundResolvingItems);
            _mockDao.Expect(b => b.GetMidGameCharacterStats(gameId, round)).Return(midGameCharacterStats);
            _mockBattleDao.Expect(b => b.GetAmbientCharacterBuffs(_mockTiersHelper, gameId, round)).Return(new List<Buff>());
            _mockBattleDao.Expect(b => b.GetActiveTriggerBuffs(_mockTiersHelper, gameId, round)).Return(triggerBuffs);
            _mockBattleDao.Expect(b => b.GetActiveAmbientBuffs(_mockTiersHelper, gameId, round)).Return(new List<Buff>());
            _mockDao.Expect(b => b.GetGame(gameId)).Return(new Common.Entities.Game { CompletionType = "single party down" });
            _mockDao.Expect(b => b.GetAbilityById(1337)).Return(ability).Repeat.Times(3);
            _mockDao.Expect(b => b.GetAbilityById(1727)).Return(attackAbility).Repeat.Times(4);
            _mockTiersHelper.Expect(b => b.AddStatistic(Arg<StatAndCount>.Is.Anything)).Repeat.Times(3);
            SetupResult.For(_mockTiersHelper.Round).Return(round);
        }

        TiersCalculationContainer container;

        using (_mockRepository.Playback())
        {
            container = engine.ProcessTiers();
        }

我知道 AAA 语法是新的热门,但我有一个已完成的大型测试,但为此我不想回去重写。

当代码执行到达“播放”的结束“}”时,我得到了这个异常:

ExpectationViolationException

TiersCalculationContainer.get_Round();预期 #1,实际 #0。

在调试测试时,“Round”属性被正确读取并返回我为它模拟的值,所以我知道它被调用了。

我在网上找不到任何关于此的信息。在 Rhino 模拟中似乎有大约 100 种模拟属性的方法。他们都没有工作,这真的令人沮丧。

我也尝试过模拟所有这些方式(以及更多方式)

_mockTiersHelper.Expect(b => b.Round).Return(round);
Expect.Call(_mockTiersHelper.Round).PropertyBehavior();
_mockTiersHelper.Round = round;

【问题讨论】:

  • 我认为这个问题的答案可能是这是一个错误。我甩掉了犀牛,回到了起订量。 10 分钟,我就开始跑步了。现在我的测试通过了。谢谢你起订量!

标签: c# unit-testing rhino-mocks


【解决方案1】:

这是对一个测试的很多期望,我建议分别测试每个对象的行为,然后只测试它们在集成点被正确调用。

除此之外,我认为您的问题是逻辑问题而不是语法问题,如果您根据文档设置模拟并获得意外行为,则它是您的代码或测试中的错误。

【讨论】:

  • 这个测试更多地是功能测试和单元测试之间的交叉。尽管这正是我所需要的,但它绝对不是单元测试。这个应用程序是一个复杂的独立模式,所有模式都以一种非常依赖的方式协同工作。如果没有这样的测试,如果没有成品可用,我是否真的包含了每个钩子或调用是不可能确定的,但我离题了。问题仍然是嘲笑这个属性根本不起作用。如果您对为什么赞赏它有任何见解,这可能是一个 Rhino 错误。
【解决方案2】:

我认为这个问题的答案可能是这是一个错误。我甩掉了犀牛,回到了起订量。 10分钟,我就开始跑步了。现在我的测试通过了。谢谢起订量!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-01-19
    • 1970-01-01
    • 1970-01-01
    • 2023-03-15
    • 1970-01-01
    • 2012-04-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多