Files
DP44/GLM5Analysis/TestScaffolds/ViewModelTestScaffold.cs
2026-04-17 14:55:32 -04:00

134 lines
3.9 KiB
C#

using System.ComponentModel;
using NUnit.Framework;
using NSubstitute;
using Prism.Events;
using Prism.Regions;
using Unity;
namespace YourNamespace.Tests
{
[TestFixture]
public class ViewModelShould
{
private IEventAggregator _eventAggregator;
private IRegionManager _regionManager;
private IUnityContainer _unityContainer;
[SetUp]
public void Setup()
{
_eventAggregator = Substitute.For<IEventAggregator>();
_regionManager = Substitute.For<IRegionManager>();
_unityContainer = Substitute.For<IUnityContainer>();
}
[Test]
public void RaisePropertyChanged_WhenPropertyIsSet()
{
var sut = CreateSut();
var eventArgs = new List<PropertyChangedEventArgs>();
sut.PropertyChanged += (sender, e) => eventArgs.Add(e);
sut.SomeProperty = "NewValue";
Assert.That(eventArgs.Count, Is.EqualTo(1));
Assert.That(eventArgs[0].PropertyName, Is.EqualTo(nameof(sut.SomeProperty)));
}
[Test]
public void NotRaisePropertyChanged_WhenPropertyIsSetToSameValue()
{
var sut = CreateSut();
sut.SomeProperty = "Value";
var eventArgs = new List<PropertyChangedEventArgs>();
sut.PropertyChanged += (sender, e) => eventArgs.Add(e);
sut.SomeProperty = "Value";
Assert.That(eventArgs.Count, Is.EqualTo(0));
}
[Test]
public void ExecuteCommand_WhenCommandIsInvoked()
{
var sut = CreateSut();
sut.SomeCommand.Execute(null);
Assert.That(sut.SomeCommandWasExecuted, Is.True);
}
[Test]
public void PublishEvent_WhenActionIsPerformed()
{
var testEvent = Substitute.For<TestEvent>();
_eventAggregator.GetEvent<TestEvent>().Returns(testEvent);
var sut = CreateSut();
sut.PerformAction();
testEvent.Received(1).Publish(Arg.Any<TestPayload>());
}
[Test]
public void SubscribeToEvents_WhenInitialized()
{
var testEvent = Substitute.For<TestEvent>();
_eventAggregator.GetEvent<TestEvent>().Returns(testEvent);
var sut = CreateSut();
testEvent.Received(1).Subscribe(Arg.Any<Action<TestPayload>>());
}
private TestViewModel CreateSut()
{
return new TestViewModel(_regionManager, _eventAggregator, _unityContainer);
}
[TearDown]
public void TearDown()
{
}
}
public class TestViewModel : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;
private string _someProperty;
public string SomeProperty
{
get => _someProperty;
set
{
if (_someProperty != value)
{
_someProperty = value;
OnPropertyChanged(nameof(SomeProperty));
}
}
}
public DelegateCommand SomeCommand { get; }
public bool SomeCommandWasExecuted { get; private set; }
public TestViewModel(IRegionManager regionManager, IEventAggregator eventAggregator, IUnityContainer unityContainer)
{
SomeCommand = new DelegateCommand(() => SomeCommandWasExecuted = true);
}
public void PerformAction() { }
protected void OnPropertyChanged(string propertyName) =>
PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
}
public class TestEvent : PubSubEvent<TestPayload> { }
public class TestPayload { }
public class DelegateCommand
{
private readonly Action _execute;
public DelegateCommand(Action execute) => _execute = execute;
public void Execute(object parameter) => _execute();
}
}