Обычно я разбиваю подобные вещи как минимум на два теста. Первый проверяет, что запуск события вызывает соответствующий обратный вызов (и этот обратный вызов вызывается ВСЕГДА, никаких условий). Условная логика, которую вы пытались проверить, переходит в соответствующий обратный вызов, который проверяется дополнительными отдельными тестами.
Первый тест можно реализовать путем создания производного класса из тестируемого класса с соответствующим переопределением обратного вызова, чтобы просто записать, что он был успешно вызван. Затем, когда вы запускаете событие, вы можете убедиться, что обратный вызов вызван.
Следующим шагом является непосредственное тестирование метода обратного вызова, как и любого другого метода.
Вот скелетный тест с кодом проверки, который вам понадобится для первого теста. Обратите внимание, что 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);
}
Ваши последующие тесты могут тестировать OnPriceUpdate напрямую.