Tôi đang nhúng các ngón chân vào cách thử nghiệm các công cụ đa luồng, nhưng không chắc chắn cách bắt đầu. Tôi chắc rằng tôi sẽ tìm những thứ nhiều hơn ngoài dễ dàng hơn nếu tôi chỉ có thể nhận được thứ đang diễn ra, vì vậy tôi đã tự hỏi nếu ai đó có thể giúp tôi viết một trường hợp thử nghiệm NUnit cho lớp này đơn giản:C#: Làm thế nào để kiểm tra một lớp công nhân luồng cơ bản
class Worker
{
public event EventHandler<EventArgs> Done = (s, e) => { };
public void StartWork()
{
var thread = new Thread(Work) { Name = "Worker Thread" };
thread.Start();
}
private void Work()
{
// Do some heavy lifting
Thread.Sleep(500);
Done(this, EventArgs.Empty);
}
}
Những gì tôi muốn kiểm tra chỉ đơn giản là: Sự kiện Done
được nâng lên khi nó kết thúc. Tôi sẽ không có vấn đề nếu nó được đồng bộ, nhưng không chắc chắn nơi để thậm chí bắt đầu khi nó không phải là. Một thử nghiệm đơn giản nếu nó không phải là đa luồng (và phương pháp Work
không phải là riêng tư) có thể là:
[TestFixture]
class WorkerTests
{
[Test]
public void DoWork_WhenDone_EventIsRaised()
{
var worker = new Worker();
var eventWasRaised = false;
worker.Done += (s, e) => eventWasRaised = true;
worker.Work();
Assert.That(eventWasRaised);
}
}
Bất kỳ con trỏ nào?
eventRaisedFlag có thể được bỏ qua. Việc sử dụng sự kiện làm cờ là đơn giản hơn. Assert.That (mre.WaitOne (1000)); –
Oooh, giờ đây thông minh ... rực rỡ! @Vadmyst: làm thế nào điều đó sẽ hoạt động nếu nói sự kiện được quản lý để kết thúc trước khi bạn gọi WaitOne? – Svish
Ồ, tôi cho rằng đó là lý do tại sao bạn nên sử dụng ManualResetEvent thay vì AutoResetEvent? – Svish