Tôi đang cố viết các bài kiểm tra đơn vị xung quanh việc triển khai SynchronizationContext
tùy chỉnh.Làm cách nào để kiểm tra việc triển khai đồng bộ hoặc không đồng bộ khi được yêu cầu?
Hai hoạt động quan trọng trong lớp này là Send
và Post
, trong đó Send
gọi một đại biểu đồng bộ và Post
gọi người được ủy quyền không đồng bộ.
Tôi muốn viết các bài kiểm tra đơn vị để xác minh hành vi này, rằng các đại biểu đã được thực hiện đồng bộ hoặc không đồng bộ. Tôi không muốn các bài kiểm tra dựa vào sự chậm trễ cho các trường hợp thành công, bởi vì nó kéo dài một cách giả tạo các thử nghiệm đang chạy (nhưng nó là hợp lý để có thất bại gây ra một sự chậm trễ) trong thực thi.
Ban đầu tôi đã xem xét sử dụng Công việc để báo hiệu việc thực hiện của một đại biểu:
var tcs = new TaskCompletionSource<object>();
var context = new CustomSynchronizationContext();
context.Send((state) => tcs.SetResult(null), null);
// Task should already be completed!
Assert.IsTrue(this.tcs.Task.IsCompleted);
Tuy nhiên, điều này không đảm bảo các đại biểu đã được không thực hiện không đồng bộ rất nhanh chóng trước khi Á hậu kiểm tra có thể tiếp tục.
Làm thế nào tôi có thể sắp xếp một bài kiểm tra xung quanh bối cảnh để đảm bảo rằng Send
khối cho việc hoàn thành các đại biểu và Post
không, nhưng mà các đại biểu là cả gọi?
+1 cho câu hỏi và Tên "bi kịch" một người giải quyết vấn đề ... :) –
ISN 't nó có thể làm một postback của 'Thread.ManagedThreadId' rằng các đại biểu thực hiện trên? Nếu nó giống như chủ đề chính, nó được thực thi đồng bộ, nếu không thì không đồng bộ. – Davio
Ngữ cảnh đồng bộ hóa sẽ không chạy bất kỳ đại biểu nào trên chuỗi cuộc gọi, vì vậy tôi không sợ. Chỉ là một chi tiết thực hiện. –