Я не уверен, правильно ли я понял.Вы хотите проверить внешнюю библиотеку, если она запускает событие?Или вы хотите проверить, что вы делаете что-то особенно, если событие запускается?
Если это последнее, я бы использовал для этого макет.Проблема, однако, в том, что ваш код кажется трудным для тестирования, потому что вы делаете логические вещи в пользовательском интерфейсе.Попробуйте написать «пассивный» вид, и пусть ведущий сделает волшебство.Например, используя шаблон «Представление представления модели» http://msdn.microsoft.com/en-us/magazine/cc188690.aspx
В таком случае все будет выглядеть следующим образом.
Модель
public class Model : IModel
{
public event EventHandler<SampleEventArgs> Completed;
public void LongRunningTask()
{
BackgroundWorker bw = new BackgroundWorker();
bw.DoWork += this.bw_DoWork;
bw.RunWorkerCompleted += this.bw_RunWorkerCompleted;
bw.RunWorkerAsync();
}
private void bw_RunWorkerCompleted(object sender, RunWorkerCompletedEventArgs e)
{
if (this.Completed != null)
{
this.Completed(this, new SampleEventArgs {Data = "Test"});
}
}
private void bw_DoWork(object sender, DoWorkEventArgs e)
{
System.Threading.Thread.Sleep(5000);
}
}
Представление
public Form1()
{
InitializeComponent();
}
public event EventHandler Button1Clicked;
public void Update(string data)
{
this.label1.Text = data;
}
private void Button1Click(object sender, EventArgs e)
{
if (this.Button1Clicked != null)
{
this.Button1Clicked(this, EventArgs.Empty);
}
}
Ведущий
public class Presenter
{
private readonly IForm1 form1;
private readonly IModel model;
public Presenter(IForm1 form1, IModel model)
{
this.form1 = form1;
this.model = model;
this.form1.Button1Clicked += this.Form1Button1Clicked;
this.model.Completed += this.ModelCompleted;
}
private void ModelCompleted(object sender, SampleEventArgs e)
{
this.form1.Update(e.Data);
}
private void Form1Button1Clicked(object sender, EventArgs e)
{
this.model.LongRunningTask();
}
}
Где-то, где вы его собираете (например, в классе Программы)
var form = new Form1();
var model = new Model();
var presenter = new Presenter(form, model);
Application.Run(form);
И тогда вы можете легко просто протестировать докладчика в модульном тесте.Часть в графическом интерфейсе теперь достаточно мала, чтобы ее нельзя было проверить.
Возможный тест может выглядеть следующим образом
[Test]
public void Test()
{
var form1Mock = new Mock<IForm1>();
var modelMock = new Mock<IModel>();
var presenter = new Presenter(form1Mock.Object, modelMock.Object);
modelMock.Setup(m => m.LongRunningTask()).Raises(m => m.Completed += null, new SampleEventArgs() { Data = "Some Data" });
form1Mock.Raise(f => f.Button1Clicked += null, EventArgs.Empty);
form1Mock.Verify(f => f.Update("Some Data"));
}