Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Events 如何测试引发事件是否会导致在参数值的条件下调用方法_Events_Tdd_Nunit_Rhino Mocks - Fatal编程技术网

Events 如何测试引发事件是否会导致在参数值的条件下调用方法

Events 如何测试引发事件是否会导致在参数值的条件下调用方法,events,tdd,nunit,rhino-mocks,Events,Tdd,Nunit,Rhino Mocks,我正在尝试编写一个单元测试,它将在我的测试类绑定到的模拟对象上引发一个事件 但我热衷于测试的是,当我的测试类调用其eventhandler时,它应该只调用eventhandler参数的某些值上的方法 即使我对调用ProcessPriceUpdate(price)的代码进行注释,我的测试似乎还是通过了 我在VS2005,所以没有lambdas请:( 所以 到目前为止我的测试…:s public void PriceUpdateEvent() { MockRepository

我正在尝试编写一个单元测试,它将在我的测试类绑定到的模拟对象上引发一个事件

但我热衷于测试的是,当我的测试类调用其eventhandler时,它应该只调用eventhandler参数的某些值上的方法

即使我对调用ProcessPriceUpdate(price)的代码进行注释,我的测试似乎还是通过了

我在VS2005,所以没有lambdas请:(

所以

到目前为止我的测试…:s

public void PriceUpdateEvent()
    {
        MockRepository mock = new MockRepository();
        IPriceInterface pi = mock.DynamicMock<IPriceInterface>();
        TestClass test = new TestClass(pi);

        decimal prc = 1M;

        IEventRaiser raiser;

        using (mock.Record())
        {
            pi.PriceUpdate += null;

            raiser = LastCall.IgnoreArguments().GetEventRaiser();

            Expect.Call(delegate { test.ProcessPriceUpdate(prc); }).Repeat.Once();

        }
        using (mock.Playback())
        {
            test.Init();
            raiser.Raise(prc);
        }
    }
public void PriceUpdateEvent()
{
MockRepository mock=新建MockRepository();
IPriceInterface pi=mock.DynamicMock();
TestClass test=新的TestClass(pi);
十进制prc=1M;
左腹侧提升器;
使用(mock.Record())
{
pi.PriceUpdate+=null;
raiser=LastCall.IgnoreArguments().GetEventRaiser();
Expect.Call(委托{test.ProcessPriceUpdate(prc);}).Repeat.Once();
}
使用(mock.Playback())
{
test.Init();
raiser.Raise(中国);
}
}

我通常会将此类事件分为至少两个测试。第一个测试验证触发事件是否调用了相应的回调(并且始终调用该回调,无条件)。您尝试测试的条件逻辑将进入相应的回调,该回调由其他单独的测试进行测试

第一个测试可以通过从被测试的类创建一个派生类来实现,并重写相应的回调以简单地记录调用成功。然后,当触发事件时,可以验证调用了回调

下一步是直接测试回调方法,就像测试任何其他方法一样

下面是一个框架测试,其中包含第一个测试所需的验证代码。请注意,OnPriceUpdate将在TestClass中变为虚拟:

public class TestClass_verifiesCallback : TestClass
{
    public bool WasCallbackCalled = false;
    public decimal PricePassedToCallback = 0;

    public override void OnPriceUpdate(decimal price)
    {
        WasCallbackCalled = true;
        pricePassedToCallback = price;
    }
}

... test methods

public TestInitSetsPriceUpdateCallback()
{
   .. setup

   var sut = new TestClass_verifiesCallback()

   .. run test

   // verification:
   Assert.IsTrue(sut.WasCallbackCalled);
   Assert.AreEqual(expectedValue, sut.PricePassedToCallback);
}

您以后的测试可以直接在PriceUpdate上进行测试。

有没有可能用一点代码来说明。我想我明白您的意思,但少量代码确实会有所帮助。:)
public class TestClass_verifiesCallback : TestClass
{
    public bool WasCallbackCalled = false;
    public decimal PricePassedToCallback = 0;

    public override void OnPriceUpdate(decimal price)
    {
        WasCallbackCalled = true;
        pricePassedToCallback = price;
    }
}

... test methods

public TestInitSetsPriceUpdateCallback()
{
   .. setup

   var sut = new TestClass_verifiesCallback()

   .. run test

   // verification:
   Assert.IsTrue(sut.WasCallbackCalled);
   Assert.AreEqual(expectedValue, sut.PricePassedToCallback);
}