我如何表达两个Rhino模拟调用的时间相关性

时间:2012-01-26 18:51:39

标签: c# rhino

我有一个需要嘲笑的设备。根据最后设置的值,设备上的状态标志会发生变化。我需要嘲笑这种行为。

这是一些不起作用的伪代码:

private delegate void setvalue(Value val);
...
Value lower = new Value(1);
Value higher = new Value(7);
ISweetInterface mock = setupSweetInterface();
Boolean flagreturn = false;
mock.Expect(x => x.Lower).Return(lower);
mock.Expect(x => x.SetValue(lower))
    .Do(new setvalue(delegate(Value val) { flagreturn = true; }));
mock.Expect(x => x.SetValue(higher))
    .Do(new setvalue(delegate(Value val) { flagreturn = false; }));

mock.Expect(x => x.CheckFlag()).Return(flagreturn);

Mockuser tested = new Mockuser(mock)
Assert.IsTrue(tested.setLowerAndCheckFlag());
Assert.IsFalse(tested.setHigherAndCheckFlag());

根据上次设置的值,设备上的标志必须更改。我认为我的代表实际上看不到旗帜。我写的代码编译,但CheckFlag()总是返回false。

我如何正确表达这种耦合行为。

1 个答案:

答案 0 :(得分:0)

我得到了另一个跟踪我的对象的帮助。其中一个基石是使用DO调用新对象,而不仅仅是尝试返回其中一个属性。

这是一些伪代码来说明:

    private class mockdevice
    {
        public List<Value> listOfTrueReturn = new List<Value>();
        private Boolean flagvalue = false;
        public bool flag()
        {
                return flagvalue;
        }
        public void setvalue(Value val)
        {
            if (listOfTrueReturn.Contains(val))
            {
                flagvalue = true;
            }
            else
            {
                flagvalue = false;
            }
        }
    }


    private delegate void setvalue(Value val);
    private delegate Boolean getflag();

    [Test]
    public void shouldAnswerStackoverflowQuestion()
    {
        float d = 5f;
        Value lower = new Value(-d, 0f, unit);
        Value higher = new Value(d, 0f, unit);
        mockdevice md = new mockdevice();
        md.listOfTrueReturn.Add(higher);

        IFindFlagDataObject mock = setupmock();
        mock.Expect(x => x.Lower).Return(lower);
        mock.Expect(x => x.Higher).Return(higher);
        mock.Expect(x => x.CheckFlag()).Do(new getflag(md.flag)).Repeat.Times(2);
        mock.Expect(x => x.SetValue(Arg<Value>.Is.Anything)).Do(new setvalue(md.setvalue)).Repeat.Times(2);

        FindFlagStrategy tested = new FindFlagStrategy(mock);
        tested.FindFlagValue();

        mock.VerifyAllExpectations();
        Mockuser tested = new Mockuser(mock)
        Assert.IsTrue(tested.setLowerAndCheckFlag());
        Assert.IsFalse(tested.setHigherAndCheckFlag());
    }