آزمون واحد در MVVM به کمک تزریق وابستگی
نویسنده: شاهین کیاست
تاریخ: ۱۳۹۲/۰۱/۰۴ ۱۷:۰
آدرس: www.dntips.ir
| مطالب | ۳۶۹۴ |
| نویسندگان | ۲۷۶ |
| گروههای مطالب | ۱۰۲۴ |
| نقشههای راه | ۱۱۹ |
| دورهها | ۱۴ |
| اشتراکها | ۱۷۹۱۴ |
public class BackgroundWorkerViewModel : BaseViewModel
{
private List<string> _myData;
public BackgroundWorkerViewModel()
{
LoadDataCommand = new RelayCommand(OnLoadData);
}
public RelayCommand LoadDataCommand { get; set; }
public List<string> MyData
{
get { return _myData; }
set
{
_myData = value;
RaisePropertyChanged(() => MyData);
}
}
public bool IsBusy { get; set; }
private void OnLoadData()
{
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += (sender, e) =>
{
MyData = new List<string> {"Test"};
Thread.Sleep(1000);
};
backgroundWorker.RunWorkerCompleted += (sender, e) => { IsBusy = false; };
backgroundWorker.RunWorkerAsync();
}
} [TestFixture]
public class BackgroundWorkerViewModelTest
{
#region Setup/Teardown
[SetUp]
public void SetUp()
{
_backgroundWorkerViewModel = new BackgroundWorkerViewModel();
}
#endregion
private BackgroundWorkerViewModel _backgroundWorkerViewModel;
[Test]
public void TestGetData()
{
_backgroundWorkerViewModel.LoadDataCommand.Execute(_backgroundWorkerViewModel);
Assert.NotNull(_backgroundWorkerViewModel.MyData);
Assert.IsNotEmpty(_backgroundWorkerViewModel.MyData);
}
} public interface IWorker
{
void Run(DoWorkEventHandler doWork);
void Run(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler onComplete);
} public class AsyncWorker : IWorker
{
public void Run(DoWorkEventHandler doWork)
{
Run(doWork, null);
}
public void Run(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler onComplete)
{
var backgroundWorker = new BackgroundWorker();
backgroundWorker.DoWork += doWork;
if (onComplete != null)
backgroundWorker.RunWorkerCompleted += onComplete;
backgroundWorker.RunWorkerAsync();
}
} public class SyncWorker : IWorker
{
#region IWorker Members
public void Run(DoWorkEventHandler doWork)
{
Run(doWork, null);
}
public void Run(DoWorkEventHandler doWork, RunWorkerCompletedEventHandler onComplete)
{
Exception error = null;
var doWorkEventArgs = new DoWorkEventArgs(null);
try
{
doWork(this, doWorkEventArgs);
}
catch (Exception ex)
{
error = ex;
throw;
}
finally
{
onComplete(this, new RunWorkerCompletedEventArgs(doWorkEventArgs.Result, error, doWorkEventArgs.Cancel));
}
}
#endregion
} public class BackgroundWorkerViewModel : BaseViewModel
{
private readonly IWorker _worker;
private List<string> _myData;
public BackgroundWorkerViewModel(IWorker worker)
{
_worker = worker;
LoadDataCommand = new RelayCommand(OnLoadData);
}
public RelayCommand LoadDataCommand { get; set; }
public List<string> MyData
{
get { return _myData; }
set
{
_myData = value;
RaisePropertyChanged(() => MyData);
}
}
public bool IsBusy { get; set; }
private void OnLoadData()
{
IsBusy = true; // view is bound to IsBusy to show 'loading' message.
_worker.Run(
(sender, e) =>
{
MyData = new List<string> {"Test"};
Thread.Sleep(1000);
},
(sender, e) => { IsBusy = false; });
}
} [TestFixture]
public class BackgroundWorkerViewModelTest
{
#region Setup/Teardown
[SetUp]
public void SetUp()
{
_backgroundWorkerViewModel = new BackgroundWorkerViewModel(new SyncWorker());
}
#endregion
private BackgroundWorkerViewModel _backgroundWorkerViewModel;
[Test]
public void TestGetData()
{
_backgroundWorkerViewModel.LoadDataCommand.Execute(_backgroundWorkerViewModel);
Assert.NotNull(_backgroundWorkerViewModel.MyData);
Assert.IsNotEmpty(_backgroundWorkerViewModel.MyData);
}
}