Skip to content

Commit 28f09e7

Browse files
committed
refactor: Move from moq to NSubstitute
1 parent 03f0059 commit 28f09e7

14 files changed

Lines changed: 75 additions & 92 deletions

tests/Directory.Build.props

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
<PackageReference Include="AutoFixture" Version="4.18.0" />
1919
<PackageReference Include="AutoFixture.Xunit2" Version="4.18.0" />
2020
<PackageReference Include="Microsoft.NET.Test.Sdk" Version="17.6.3" />
21-
<PackageReference Include="Moq" Version="4.18.4" />
21+
<PackageReference Include="NSubstitute" Version="5.0.0" />
2222
<PackageReference Include="Shouldly" Version="4.2.1" />
2323
<PackageReference Include="xunit" Version="2.5.0" />
2424
<PackageReference Include="Xunit.Combinatorial" Version="1.5.25" />
@@ -39,7 +39,7 @@
3939
<Using Include="Microsoft.AspNetCore.Components.Web" />
4040
<Using Include="Microsoft.AspNetCore.Components.Routing" />
4141
<Using Include="System.Reflection" />
42-
<Using Include="Moq" />
42+
<Using Include="NSubstitute" />
4343
<Using Include="Shouldly" />
4444
<Using Include="Xunit" />
4545
<Using Include="Xunit.Abstractions" />

tests/bunit.core.tests/ComponentFactories/ConditionalComponentFactoryTest.cs

Lines changed: 16 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -22,7 +22,7 @@ public void Test003()
2222
[Fact(DisplayName = "Component is replaced in render tree with component from factory when matches returns true")]
2323
public void Test010()
2424
{
25-
var mockComponent = Mock.Of<Simple1>();
25+
var mockComponent = Substitute.For<Simple1>();
2626
ComponentFactories.Add(type => type == typeof(Simple1), _ => mockComponent);
2727

2828
var cut = RenderComponent<Wrapper>(ps => ps.AddChildContent<Simple1>());
@@ -34,17 +34,21 @@ public void Test010()
3434
[Fact(DisplayName = "Component is replaced in render tree with component from factory when matches returns true")]
3535
public void Test011()
3636
{
37-
var mockRepo = new MockRepository(MockBehavior.Loose);
37+
var mockSimple1 = Substitute.For<Simple1>();
38+
var mockNoArgs = Substitute.For<NoArgs>();
3839
ComponentFactories.Add(
3940
type => type != typeof(TwoComponentWrapper),
40-
mockRepo.CreateComponent);
41+
type => CreateComponent(type, mockSimple1, mockNoArgs)
42+
);
4143

44+
// Act
4245
var cut = RenderComponent<TwoComponentWrapper>(ps => ps
43-
.Add<Simple1>(p => p.First)
44-
.Add<NoArgs>(p => p.Second));
46+
.Add<Simple1>(p => p.First)
47+
.Add<NoArgs>(p => p.Second));
4548

46-
cut.FindComponents<Simple1>().ShouldAllBe(x => Mock.Get(x.Instance));
47-
cut.FindComponents<NoArgs>().ShouldAllBe(x => Mock.Get(x.Instance));
49+
// Assert
50+
cut.FindComponents<Simple1>().ShouldAllBe(x => x.Instance == mockSimple1);
51+
cut.FindComponents<NoArgs>().ShouldAllBe(x => x.Instance == mockNoArgs);
4852
}
4953

5054
[Fact(DisplayName = "When matches returns false, factory is never called")]
@@ -54,19 +58,12 @@ public void Test012()
5458

5559
Should.NotThrow(() => RenderComponent<Wrapper>(ps => ps.AddChildContent<Simple1>()));
5660
}
57-
}
58-
59-
internal static class MockRepositoryExtensions
60-
{
61-
private static readonly MethodInfo CreateMethodInfo = typeof(MockRepository)
62-
.GetMethod(nameof(MockRepository.Create), Array.Empty<Type>());
63-
64-
public static IComponent CreateComponent(this MockRepository repository, Type type)
61+
62+
private static IComponent CreateComponent(Type type, Simple1 simple1, NoArgs noArgs)
6563
{
66-
var genericCreateMethod = CreateMethodInfo.MakeGenericMethod(type);
67-
var mock = (Mock)genericCreateMethod.Invoke(repository, null);
68-
return (IComponent)mock.Object;
64+
if (type == typeof(Simple1)) return simple1;
65+
if (type == typeof(NoArgs)) return noArgs;
66+
throw new NotImplementedException($"No mock implementation provided for type {type.FullName}");
6967
}
7068
}
71-
7269
#endif

tests/bunit.core.tests/ComponentFactories/InstanceComponentFactoryTest.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -15,20 +15,20 @@ public void Test002()
1515
[Fact(DisplayName = "Factory replaces one TComponent with instance in the render tree")]
1616
public void Test010()
1717
{
18-
var simple1Mock = new Mock<Simple1>();
19-
ComponentFactories.Add<Simple1>(simple1Mock.Object);
18+
var simple1Mock = Substitute.For<Simple1>();
19+
ComponentFactories.Add(simple1Mock);
2020

2121
var cut = RenderComponent<Wrapper>(ps => ps.AddChildContent<Simple1>());
2222

2323
cut.FindComponent<Simple1>()
24-
.Instance.ShouldBeSameAs(simple1Mock.Object);
24+
.Instance.ShouldBeSameAs(simple1Mock);
2525
}
2626

2727
[Fact(DisplayName = "Factory throws if component instance is requested twice for TComponent that inherits from ComponentBase")]
2828
public void Test020()
2929
{
30-
var simple1Mock = new Mock<Simple1>();
31-
ComponentFactories.Add<Simple1>(simple1Mock.Object);
30+
var simple1Mock = Substitute.For<Simple1>();
31+
ComponentFactories.Add(simple1Mock);
3232

3333
Should.Throw<InvalidOperationException>(() => RenderComponent<TwoComponentWrapper>(ps => ps
3434
.Add<Simple1>(p => p.First)
@@ -38,8 +38,8 @@ public void Test020()
3838
[Fact(DisplayName = "Factory throws if component instance is requested twice for TComponent that implements from IComponent")]
3939
public void Test021()
4040
{
41-
var simple1Mock = new Mock<BasicComponent>();
42-
ComponentFactories.Add<BasicComponent>(simple1Mock.Object);
41+
var simple1Mock = Substitute.For<BasicComponent>();
42+
ComponentFactories.Add(simple1Mock);
4343

4444
Should.Throw<InvalidOperationException>(() => RenderComponent<TwoComponentWrapper>(ps => ps
4545
.Add<BasicComponent>(p => p.First)

tests/bunit.core.tests/ComponentFactories/TypeBasedComponentFactoryTest.cs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -16,7 +16,7 @@ public void Test002()
1616
[Fact(DisplayName = "TComponent replaced in render tree with component from factory method")]
1717
public void Test010()
1818
{
19-
var simple1Mock = Mock.Of<Simple1>();
19+
var simple1Mock = Substitute.For<Simple1>();
2020
ComponentFactories.Add<Simple1>(() => simple1Mock);
2121

2222
var cut = RenderComponent<Wrapper>(ps => ps.AddChildContent<Simple1>());
@@ -28,17 +28,17 @@ public void Test010()
2828
[Fact(DisplayName = "Multiple TComponent replaced in render tree with component from factory method")]
2929
public void Test011()
3030
{
31-
var mockRepo = new MockRepository(MockBehavior.Loose);
32-
ComponentFactories.Add<Simple1>(() => mockRepo.Create<Simple1>().Object);
31+
ComponentFactories.Add(() => Substitute.For<Simple1>());
3332

3433
var cut = RenderComponent<TwoComponentWrapper>(ps => ps
3534
.Add<Simple1>(p => p.First)
3635
.Add<Simple1>(p => p.Second));
3736

38-
cut.FindComponents<Simple1>()
39-
.ShouldAllBe(
40-
x => Mock.Get(x.Instance),
41-
x => Mock.Get(x.Instance));
37+
foreach (var component in cut.FindComponents<Simple1>())
38+
{
39+
Action checkIfSubstitute = () => component.Instance.Received();
40+
checkIfSubstitute.ShouldNotThrow();
41+
}
4242
}
4343
}
4444

tests/bunit.core.tests/Rendering/TestRendererTest.net5.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@
77
using Bunit.TestAssets.SampleComponents;
88
using Microsoft.AspNetCore.Components;
99
using Microsoft.Extensions.Logging.Abstractions;
10-
using Moq;
1110
using Xunit;
1211

1312
namespace Bunit.Rendering;
@@ -19,17 +18,17 @@ public partial class TestRendererTest : TestContext
1918
"then it used to create components")]
2019
public void Test1000()
2120
{
22-
var activatorMock = new Mock<IComponentActivator>();
23-
activatorMock.Setup(x => x.CreateInstance(typeof(Wrapper))).Returns(new Wrapper());
21+
var activatorMock = Substitute.For<IComponentActivator>();
22+
activatorMock.CreateInstance(typeof(Wrapper)).Returns(new Wrapper());
2423
using var renderer = new TestRenderer(
2524
Services.GetService<IRenderedComponentActivator>(),
2625
Services,
2726
NullLoggerFactory.Instance,
28-
activatorMock.Object);
27+
activatorMock);
2928

3029
renderer.RenderComponent<Wrapper>(new ComponentParameterCollection());
3130

32-
activatorMock.Verify(x => x.CreateInstance(typeof(Wrapper)), Times.Once());
31+
activatorMock.Received(1).CreateInstance(typeof(Wrapper));
3332
}
3433
}
3534
#endif

tests/bunit.core.tests/TestContextBaseTest.net5.cs

Lines changed: 16 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -11,40 +11,40 @@ public partial class TestContextBaseTest : TestContext
1111
public void Test0001()
1212
{
1313
var mock = CreateMockComponentFactory(canCreate: _ => false, create: _ => null);
14-
ComponentFactories.Add(mock.Object);
14+
ComponentFactories.Add(mock);
1515

1616
RenderComponent<Simple1>();
1717

18-
mock.Verify(x => x.CanCreate(typeof(Simple1)), Times.Once);
19-
mock.Verify(x => x.Create(It.IsAny<Type>()), Times.Never);
18+
mock.Received(1).CanCreate(typeof(Simple1));
19+
mock.DidNotReceive().Create(Arg.Any<Type>());
2020
}
2121

2222
[Fact(DisplayName = "ComponentFactories Create() method is called when their CanCreate() method returns true")]
2323
public void Test0002()
2424
{
2525
var mock = CreateMockComponentFactory(canCreate: _ => true, create: _ => new Simple1());
26-
ComponentFactories.Add(mock.Object);
26+
ComponentFactories.Add(mock);
2727

2828
RenderComponent<Simple1>();
2929

30-
mock.Verify(x => x.CanCreate(typeof(Simple1)), Times.Once);
31-
mock.Verify(x => x.Create(typeof(Simple1)), Times.Once);
30+
mock.Received(1).CanCreate(typeof(Simple1));
31+
mock.Received(1).Create(typeof(Simple1));
3232
}
3333

3434
[Fact(DisplayName = "ComponentFactories is used in last added order")]
3535
public void Test0003()
3636
{
3737
var firstMock = CreateMockComponentFactory(canCreate: _ => true, create: _ => new Simple1());
3838
var secondMock = CreateMockComponentFactory(canCreate: _ => true, create: _ => new Simple1());
39-
ComponentFactories.Add(firstMock.Object);
40-
ComponentFactories.Add(secondMock.Object);
39+
ComponentFactories.Add(firstMock);
40+
ComponentFactories.Add(secondMock);
4141

4242
RenderComponent<Simple1>();
4343

44-
firstMock.Verify(x => x.CanCreate(It.IsAny<Type>()), Times.Never);
45-
firstMock.Verify(x => x.Create(It.IsAny<Type>()), Times.Never);
46-
secondMock.Verify(x => x.CanCreate(typeof(Simple1)), Times.Once);
47-
secondMock.Verify(x => x.Create(typeof(Simple1)), Times.Once);
44+
firstMock.DidNotReceive().CanCreate(Arg.Any<Type>());
45+
firstMock.DidNotReceive().Create(Arg.Any<Type>());
46+
secondMock.Received(1).CanCreate(typeof(Simple1));
47+
secondMock.Received(1).Create(typeof(Simple1));
4848
}
4949

5050
[Fact(DisplayName = "DisposeComponents captures exceptions from DisposeAsync in Renderer.UnhandledException")]
@@ -160,11 +160,11 @@ public async ValueTask DisposeAsync()
160160
}
161161
}
162162

163-
private static Mock<IComponentFactory> CreateMockComponentFactory(Func<Type, bool> canCreate, Func<Type, IComponent> create)
163+
private static IComponentFactory CreateMockComponentFactory(Func<Type, bool> canCreate, Func<Type, IComponent> create)
164164
{
165-
var result = new Mock<IComponentFactory>(MockBehavior.Strict);
166-
result.Setup(x => x.CanCreate(It.IsAny<Type>())).Returns(canCreate);
167-
result.Setup(x => x.Create(It.IsAny<Type>())).Returns(create);
165+
var result = Substitute.For<IComponentFactory>();
166+
result.CanCreate(Arg.Any<Type>()).Returns(call => canCreate((Type)call[0]));
167+
result.Create(Arg.Any<Type>()).Returns(call => create((Type)call[0]));
168168
return result;
169169
}
170170
}

tests/bunit.web.testcomponents.tests/RazorTesting/RazorTestDiscovererTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -13,8 +13,8 @@ public class RazorTestDiscovererTest
1313
public RazorTestDiscovererTest()
1414
{
1515
options = TestFrameworkOptions.ForDiscovery();
16-
messageBus = Mock.Of<IMessageSink>();
17-
attribute = Mock.Of<IReflectionAttributeInfo>();
16+
messageBus = Substitute.For<IMessageSink>();
17+
attribute = Substitute.For<IReflectionAttributeInfo>();
1818
}
1919

2020
[Fact(DisplayName = "Can find single razor test in test component")]

tests/bunit.web.testcomponents.tests/RazorTesting/RazorTestSourceInformationProviderTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ namespace Bunit.RazorTesting;
88
public sealed class RazorTestSourceInformationProviderTest : IDisposable
99
{
1010
private readonly TestComponentRenderer renderer = new();
11-
private readonly IMessageSink messageBus = Mock.Of<IMessageSink>();
11+
private readonly IMessageSink messageBus = Substitute.For<IMessageSink>();
1212

1313
private RazorTestBase GetTest(Type testComponent, int testIndex)
1414
{

tests/bunit.web.tests/Asserting/CompareToDiffingExtensionsTest.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,8 @@ public static IEnumerable<object[]> GetCompareToMethods()
2222
object p1 = p1Info.ParameterType.ToMockInstance();
2323
object p2 = p2Info.ParameterType.ToMockInstance();
2424

25-
yield return new object[] { method, p1Info.Name!, new object[] { null!, p2! } };
26-
yield return new object[] { method, p2Info.Name!, new object[] { p1!, null! } };
25+
yield return new object[] { method, p1Info.Name!, new[] { null!, p2! } };
26+
yield return new object[] { method, p2Info.Name!, new[] { p1!, null! } };
2727
}
2828
}
2929

tests/bunit.web.tests/Asserting/DiffAssertExtensionsTest.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -44,7 +44,7 @@ public void Test002(IReadOnlyList<IDiff> diffs)
4444
[Fact(DisplayName = "ShouldHaveSingleChange returns the single diff in input when there is only one")]
4545
public void Test003()
4646
{
47-
var input = new IDiff[] { Mock.Of<IDiff>() };
47+
var input = new[] { Substitute.For<IDiff>() };
4848

4949
var output = input.ShouldHaveSingleChange();
5050

@@ -58,8 +58,8 @@ public static IEnumerable<object[]> GetDiffLists()
5858
{
5959
new IDiff[]
6060
{
61-
Mock.Of<IDiff>(),
62-
Mock.Of<IDiff>(),
61+
Substitute.For<IDiff>(),
62+
Substitute.For<IDiff>(),
6363
},
6464
};
6565
}

0 commit comments

Comments
 (0)