Tôi đã làm rất nhiều Googling, và thậm chí Bing-ing và tôi đã không đưa ra bất cứ điều gì thỏa mãn.Thử nghiệm một async ICommand
Tôi có một ViewModel có một số lệnh, chẳng hạn như SaveCommand và NewCommand và DeleteCommand. SaveCommand của tôi thực hiện thao tác lưu vào một tệp, mà tôi muốn nó hoạt động Async để giao diện người dùng không chờ đợi nó.
SaveCommand của tôi là phiên bản AsyncCommand, cài đặt ICommand.
SaveCommand = new AsyncCommand(
async param =>
{
Connection con = await Connection.GetInstanceAsync(m_configurationPath);
con.Shoppe.Configurations = new List<CouchDbConfig>(m_configurations);
await con.SaveConfigurationAsync(m_configurationPath);
//now that its saved, we reload the Data.
await LoadDataAsync(m_configurationPath);
},
...etc
Bây giờ tôi đang tạo thử nghiệm cho ViewModel của mình. Trong đó, tôi tạo ra một điều mới với NewCommand và sau đó tôi sửa đổi nó, và sau đó sử dụng SaveCommand.
vm.SaveCommand.Execute(null);
Assert.IsFalse(vm.SaveCommand.CanExecute(null));
Phương thức CanExecute của tôi (không được hiển thị) của SaveCommand sẽ trả về Sai ngay sau khi mục đã được Lưu. (không có điểm tiết kiệm một mục không thay đổi). Tuy nhiên, Assert hiển thị ở trên thất bại tất cả các thời gian vì tôi không chờ đợi cho SaveCommand để hoàn thành thực hiện.
Bây giờ, tôi không thể chờ nó hoàn thành việc thực thi vì tôi không thể. ICommand.Execute không trả về một nhiệm vụ. Và nếu tôi thay đổi AsyncCommand để có Execute trả về một Task thì nó sẽ không thực hiện đúng giao diện ICommand.
Vì vậy, điều duy nhất tôi nghĩ rằng tôi có thể làm bây giờ, cho mục đích thử nghiệm, là cho AsynCommand để có một chức năng mới,
public async Task ExecuteAsync(object parm) { ... }
Và do đó, thử nghiệm của tôi sẽ chạy (và chờ đợi) các ExecuteAsync và giao diện XAML sẽ chạy phương thức ICommand.Execute, trong đó nó không chờ đợi.
Tôi không cảm thấy hạnh phúc khi thực hiện phương pháp giải pháp được đề xuất như tôi nghĩ, và hy vọng, và mong rằng có một cách tốt hơn.
Là những gì tôi đề xuất, hợp lý? Có cách nào tốt hơn?
Bạn có bất cứ tài sản trong lệnh của bạn nói rằng "Chạy" hoặc "Thi công"? Có thể một cách là thêm cờ Thi hành vào lệnh. Cũng có thể sửa chữa tại sao thử nghiệm không thành công, bạn có thể sử dụng cờ Thực thi trong CanExecute để đảm bảo rằng chúng không chạy lệnh hai lần. –
Tôi hiểu ý của bạn là gì. Hãy để tôi thử điều đó. * backsoon –
Trên thực tế, AsyncCommand đã có cờ Thi hành. Khi tôi tìm thấy vấn đề ban đầu, TBH, tôi đã không sử dụng AsyncCommand, thay vào đó một thứ khác thì không. Có lẽ tôi không thực sự có một vấn đề bây giờ! .. kiểm tra –