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