ViewModel Unit Testing হল MVVM প্যাটার্নে ViewModel এর কার্যকারিতা পরীক্ষা করার প্রক্রিয়া। ViewModel মূলত ব্যবহারকারীর UI-এর জন্য উপযুক্ত ডেটা এবং কমান্ড সরবরাহ করে, এবং এতে বিজনেস লজিকের অনেক অংশ থাকতে পারে, যা Model এর সাথে যোগাযোগ করে। তাই, ViewModel-এর ইউনিট টেস্টিং খুবই গুরুত্বপূর্ণ যাতে নিশ্চিত করা যায় যে, বিজনেস লজিক সঠিকভাবে কাজ করছে এবং UI-তে সঠিক ডেটা পাঠানো হচ্ছে।
Unit Testing-এর উদ্দেশ্য
- ViewModel এর বিজনেস লজিক এবং কমান্ডগুলো সঠিকভাবে কাজ করছে কিনা পরীক্ষা করা।
- Data Binding এবং ICommand এর কার্যকারিতা পরীক্ষা করা।
- Model বা অন্যান্য ডিপেন্ডেন্সি সঠিকভাবে ইন্টারঅ্যাক্ট করছে কিনা যাচাই করা।
Unit Testing Setup
Unit Testing করার জন্য সাধারণত Mocking Frameworks যেমন Moq, NSubstitute, বা FakeItEasy ব্যবহার করা হয়, যাতে ডিপেন্ডেন্সিগুলোকে মক বা ফেক করা যায়। এইভাবে, আপনি ViewModel এর টেস্টিং করতে পারবেন এবং বাইরের ডিপেন্ডেন্সির প্রভাব থেকে মুক্ত থাকতে পারবেন।
1. Testing ICommand (Commands)
ICommand হল MVVM প্যাটার্নের একটি গুরুত্বপূর্ণ অংশ, যা View থেকে ViewModel-এ ইউজারের অ্যাকশন পাঠায়। Unit Testing-এ ICommand এর কার্যকারিতা যাচাই করা হয়। কমান্ডটি কি সঠিকভাবে এক্সিকিউট হচ্ছে, তার ফলাফল সঠিক কিনা, এবং এর CanExecute মেথড কাজ করছে কিনা তা পরীক্ষা করা হয়।
ICommand Unit Test Example
ধরা যাক, আমাদের একটি ViewModel রয়েছে যেখানে একটি SubmitCommand কমান্ড রয়েছে, যা একটি পদ্ধতি কল করবে যখন কমান্ডটি এক্সিকিউট হবে।
ViewModel Code:
public class MyViewModel : INotifyPropertyChanged
{
public ICommand SubmitCommand { get; private set; }
public MyViewModel()
{
SubmitCommand = new RelayCommand(Submit, CanSubmit);
}
private void Submit()
{
// Submit logic
}
private bool CanSubmit()
{
return true; // Example condition
}
}
Unit Test for ICommand:
public class MyViewModelTests
{
[Fact]
public void SubmitCommand_CanExecute_ReturnsTrue()
{
// Arrange
var viewModel = new MyViewModel();
// Act
var canExecute = viewModel.SubmitCommand.CanExecute(null);
// Assert
Assert.True(canExecute);
}
[Fact]
public void SubmitCommand_Execute_CallsSubmitMethod()
{
// Arrange
var viewModel = new MyViewModel();
var submitCalled = false;
// Mocking Submit method or observing the result
viewModel.SubmitCommand.Execute(null);
// Assert
Assert.True(submitCalled);
}
}
এখানে, SubmitCommand এর CanExecute এবং Execute মেথড টেস্ট করা হয়েছে।
2. Mocking Model Dependencies
ViewModel সাধারণত Model অথবা অন্যান্য সার্ভিসের ওপর নির্ভরশীল হয়। Unit Testing-এ আপনি Model বা অন্য কোন ডিপেন্ডেন্সি মক করতে পারেন যাতে টেস্টের সময় আপনি বাইরের ডিপেন্ডেন্সির বাস্তব কাজ থেকে মুক্ত থাকতে পারেন।
Mocking Model Example:
ধরা যাক, আমাদের ViewModel একটি DataService নামক সার্ভিসের উপর নির্ভরশীল, যা ডেটা ফেচিং করে। DataService-এর ফাংশনality মক করে টেস্টে ব্যবহার করা হয়।
ViewModel Code:
public class DataViewModel : INotifyPropertyChanged
{
private IDataService _dataService;
public string Data { get; private set; }
public DataViewModel(IDataService dataService)
{
_dataService = dataService;
}
public void LoadData()
{
Data = _dataService.GetData();
}
}
Unit Test for Model Mocking:
public class DataViewModelTests
{
[Fact]
public void LoadData_CallsDataServiceAndSetsData()
{
// Arrange
var mockDataService = new Mock<IDataService>();
mockDataService.Setup(service => service.GetData()).Returns("Test Data");
var viewModel = new DataViewModel(mockDataService.Object);
// Act
viewModel.LoadData();
// Assert
Assert.Equal("Test Data", viewModel.Data);
mockDataService.Verify(service => service.GetData(), Times.Once);
}
}
এখানে, IDataService কে মক করা হয়েছে এবং LoadData() মেথডটি সঠিকভাবে কাজ করছে কিনা তা পরীক্ষা করা হয়েছে।
3. Testing Property Changes (INotifyPropertyChanged)
INotifyPropertyChanged ইন্টারফেসের মাধ্যমে, ViewModel ডেটা পরিবর্তনের তথ্য View কে পাঠাতে পারে। Unit Testing-এ আমরা পরীক্ষা করতে পারি যে, কোন প্রোপার্টির মান পরিবর্তন হলে PropertyChanged ইভেন্টটি সঠিকভাবে ট্রিগার হচ্ছে কিনা।
Testing INotifyPropertyChanged
public class PersonViewModel : INotifyPropertyChanged
{
private string _name;
public string Name
{
get { return _name; }
set
{
if (_name != value)
{
_name = value;
OnPropertyChanged();
}
}
}
public event PropertyChangedEventHandler PropertyChanged;
protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
{
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
}
Unit Test for PropertyChanged
public class PersonViewModelTests
{
[Fact]
public void Name_SettingProperty_RaisesPropertyChanged()
{
// Arrange
var viewModel = new PersonViewModel();
var wasPropertyChanged = false;
viewModel.PropertyChanged += (sender, e) =>
{
if (e.PropertyName == nameof(PersonViewModel.Name))
{
wasPropertyChanged = true;
}
};
// Act
viewModel.Name = "John";
// Assert
Assert.True(wasPropertyChanged);
}
}
এখানে, Name প্রোপার্টির জন্য PropertyChanged ইভেন্টটি সঠিকভাবে ট্রিগার হচ্ছে কিনা তা পরীক্ষা করা হয়েছে।
4. Edge Case Testing
Edge Cases বা বিশেষ পরিস্থিতিতে ViewModel কীভাবে কাজ করে তা পরীক্ষা করা প্রয়োজন। যেমন, খালি ইনপুট, ভুল ফরম্যাটের ইনপুট, বা অপ্রত্যাশিত ডেটার সাথে ViewModel এর আচরণ পরীক্ষা করা।
Edge Case Example:
public class MyViewModelTests
{
[Fact]
public void SubmitCommand_EmptyInput_ReturnsFalse()
{
// Arrange
var viewModel = new MyViewModel();
viewModel.Username = ""; // Empty input
// Act
var canExecute = viewModel.SubmitCommand.CanExecute(null);
// Assert
Assert.False(canExecute);
}
}
এখানে, SubmitCommand এর CanExecute মেথডটি পরীক্ষা করা হয়েছে, যাতে দেখা যায় ইনপুট ফিল্ড খালি থাকলে এটি False রিটার্ন করে।
Conclusion
ViewModel Unit Testing হল MVVM প্যাটার্নে ViewModel এর কার্যকারিতা পরীক্ষা করার একটি গুরুত্বপূর্ণ প্রক্রিয়া। এতে বিভিন্ন ধরনের টেস্টিং কৌশল, যেমন ICommand টেস্টিং, Model মকিং, INotifyPropertyChanged ইভেন্ট টেস্টিং, এবং Edge Case টেস্টিং অন্তর্ভুক্ত থাকে। এই কৌশলগুলি আপনাকে অ্যাপ্লিকেশনের স্থিতিশীলতা নিশ্চিত করতে সাহায্য করবে এবং উন্নত মানের কোড তৈরি করতে সহায়ক হবে।
Read more