-
-
Notifications
You must be signed in to change notification settings - Fork 128
Expand file tree
/
Copy pathProtectedMemberTests.cs
More file actions
109 lines (89 loc) · 3.09 KB
/
Copy pathProtectedMemberTests.cs
File metadata and controls
109 lines (89 loc) · 3.09 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
using TUnit.Mocks.Arguments;
namespace TUnit.Mocks.Tests;
/// <summary>
/// Abstract class with protected virtual members for testing.
/// </summary>
public abstract class ProtectedServiceBase
{
public abstract string GetName();
protected virtual int ComputeValue(int input)
{
return input * 2;
}
protected abstract string FormatResult(int value);
public string ProcessAndFormat(int input)
{
var value = ComputeValue(input);
return FormatResult(value);
}
}
/// <summary>
/// US17 Tests: Protected member mocking.
/// </summary>
public class ProtectedMemberTests
{
[Test]
public async Task Protected_Virtual_Method_Calls_Base_When_Not_Configured()
{
// Arrange
var mock = ProtectedServiceBase.Mock();
mock.GetName().Returns("Test");
mock.FormatResult(Any()).Returns("formatted");
// Act — ComputeValue is protected virtual, not configured → calls base (input * 2)
var result = mock.Object.ProcessAndFormat(5);
// Assert — FormatResult receives 10 (5 * 2 from base ComputeValue)
mock.FormatResult(Is(10)).WasCalled();
await Assert.That(result).IsEqualTo("formatted");
}
[Test]
public async Task Protected_Virtual_Method_Can_Be_Configured()
{
// Arrange
var mock = ProtectedServiceBase.Mock();
mock.GetName().Returns("Test");
mock.ComputeValue(Any()).Returns(42);
mock.FormatResult(Any()).Returns("configured");
// Act — ComputeValue is configured to return 42
var result = mock.Object.ProcessAndFormat(5);
// Assert — FormatResult receives 42 (from configured ComputeValue)
mock.FormatResult(Is(42)).WasCalled();
await Assert.That(result).IsEqualTo("configured");
}
[Test]
public async Task Protected_Abstract_Method_Can_Be_Configured()
{
// Arrange
var mock = ProtectedServiceBase.Mock();
mock.GetName().Returns("Test");
mock.FormatResult(Any()).Returns("custom format");
// Act
var result = mock.Object.ProcessAndFormat(3);
// Assert
await Assert.That(result).IsEqualTo("custom format");
}
[Test]
public async Task Protected_Method_Calls_Are_Recorded_In_Invocations()
{
// Arrange
var mock = ProtectedServiceBase.Mock();
mock.GetName().Returns("Test");
mock.FormatResult(Any()).Returns("result");
// Act
mock.Object.ProcessAndFormat(7);
// Assert — both ComputeValue (base call) and FormatResult are recorded
await Assert.That(Mock.Invocations(mock)).Count().IsGreaterThanOrEqualTo(2);
}
[Test]
public async Task Protected_Method_Can_Be_Verified()
{
// Arrange
var mock = ProtectedServiceBase.Mock();
mock.GetName().Returns("Test");
mock.FormatResult(Any()).Returns("result");
// Act
mock.Object.ProcessAndFormat(5);
// Assert — verify protected methods were called
mock.ComputeValue(Is(5)).WasCalled();
mock.FormatResult(Any()).WasCalled();
}
}