如何模拟哪个正在使用某些参数调用另一个方法?
How to mock which is calling another method with some parameter?
我的服务class有接口和注入服务。
public class SomeService
{
private readonly ICustomConfigManager _customConfigManager;
private readonly IList<DefaultRoleSetting> _defaultRoleSettings;
public FCCLicenseTrackerService(ICustomConfigManager customConfigManager)
{
_customConfigManager = customConfigManager;
_defaultRoleSettings = customConfigManager.DefaultRoleSettings;
}
我必须对其进行单元测试用例的服务方法。
public async Task<List<CustomModel>> GetRequests(string Id)
{
var defaultRoleSetting = _defaultRoleSettings.FirstOrDefault(roleSetting => roleSetting.RoleId == Guid.Parse(GroupHelper.Name));
ValidateDefaultSettings(defaultRoleSetting);
return customReq;
}
private void ValidateDefaultSettings(DefaultRoleSetting defaultRoleSetting)
{
if (defaultRoleSetting == null)
{
throw new ArgumentException($"{nameof(defaultRoleSetting)} is null");
}
if (string.IsNullOrWhiteSpace(defaultRoleSetting.Name))
{
throw new ArgumentException($"{nameof(defaultRoleSetting.Name)} is null or empty");
}
if (string.IsNullOrWhiteSpace(defaultRoleSetting.Email))
{
throw new ArgumentException($"{nameof(defaultRoleSetting.Email)} is null or empty");
}
}
}
我是单元测试用例的新手,因为我在网上浏览过,没有得到任何模拟内部方法的解决方案,因此当 'defaultRoleSetting' 为 null pass 时我感到震惊。
所以任何人都可以共享示例代码来模拟 'var defaultRoleSetting'.
我的测试代码是
public async Task GetRequests_SendingValidId_ExpectedReturnObjectType()
{
// Arrange
var fakeDefaultReq = FakeDefaultRoleSetting();
_mockCustomConfigManager.Setup(s => s.DefaultRoleSettings).Returns(fakeDefaultReq);
var service = this.CreateService();
string Id = "2";
var expected = JsonConvert.DeserializeObject<IList<JObject>>(GetFakeRequests());
//Act
var result = await service.GetRequests(Id);
// Assert
Assert.Equal(JsonConvert.SerializeObject(result), JsonConvert.SerializeObject(expected));
}
模拟依赖注入的假对象方法。
private List<DefaultRoleSetting> FakeDefaultRoleSetting()
{
string fakeData = @"[{
'RoleId': '00000000-0000-0000-0000-000000000000',
'Name': null,
'Email': null,
'UserId': '00000000-0000-0000-0000-000000000000'
}]";
return JsonConvert.DeserializeObject<List<DefaultRoleSetting>>(fakeData);
}
return 匹配的假对象方法。
private string GetFakeRequests()
{
string fakeData = @"[{
'userId': '00000000-0000-0000-0000-000000000000',
'StatusId': 0.0,
'createdOn': '0001-01-01T00:00:00',
'createdBy': '00000000-0000-0000-0000-000000000000',
'modifiedOn': null,
'modifiedBy': null,
'buildoutCompletedDate': null,
'buildoutDeadlineReason': null
}]";
return fakeData;
}
实际上我在 'FakeDefaultRoleSetting' json 方法中发送了虚拟数据,当我将其转换为真实数据时,问题就消失了。感谢大家的支持。
我的服务class有接口和注入服务。
public class SomeService
{
private readonly ICustomConfigManager _customConfigManager;
private readonly IList<DefaultRoleSetting> _defaultRoleSettings;
public FCCLicenseTrackerService(ICustomConfigManager customConfigManager)
{
_customConfigManager = customConfigManager;
_defaultRoleSettings = customConfigManager.DefaultRoleSettings;
}
我必须对其进行单元测试用例的服务方法。
public async Task<List<CustomModel>> GetRequests(string Id)
{
var defaultRoleSetting = _defaultRoleSettings.FirstOrDefault(roleSetting => roleSetting.RoleId == Guid.Parse(GroupHelper.Name));
ValidateDefaultSettings(defaultRoleSetting);
return customReq;
}
private void ValidateDefaultSettings(DefaultRoleSetting defaultRoleSetting)
{
if (defaultRoleSetting == null)
{
throw new ArgumentException($"{nameof(defaultRoleSetting)} is null");
}
if (string.IsNullOrWhiteSpace(defaultRoleSetting.Name))
{
throw new ArgumentException($"{nameof(defaultRoleSetting.Name)} is null or empty");
}
if (string.IsNullOrWhiteSpace(defaultRoleSetting.Email))
{
throw new ArgumentException($"{nameof(defaultRoleSetting.Email)} is null or empty");
}
}
}
我是单元测试用例的新手,因为我在网上浏览过,没有得到任何模拟内部方法的解决方案,因此当 'defaultRoleSetting' 为 null pass 时我感到震惊。 所以任何人都可以共享示例代码来模拟 'var defaultRoleSetting'.
我的测试代码是
public async Task GetRequests_SendingValidId_ExpectedReturnObjectType()
{
// Arrange
var fakeDefaultReq = FakeDefaultRoleSetting();
_mockCustomConfigManager.Setup(s => s.DefaultRoleSettings).Returns(fakeDefaultReq);
var service = this.CreateService();
string Id = "2";
var expected = JsonConvert.DeserializeObject<IList<JObject>>(GetFakeRequests());
//Act
var result = await service.GetRequests(Id);
// Assert
Assert.Equal(JsonConvert.SerializeObject(result), JsonConvert.SerializeObject(expected));
}
模拟依赖注入的假对象方法。
private List<DefaultRoleSetting> FakeDefaultRoleSetting()
{
string fakeData = @"[{
'RoleId': '00000000-0000-0000-0000-000000000000',
'Name': null,
'Email': null,
'UserId': '00000000-0000-0000-0000-000000000000'
}]";
return JsonConvert.DeserializeObject<List<DefaultRoleSetting>>(fakeData);
}
return 匹配的假对象方法。
private string GetFakeRequests()
{
string fakeData = @"[{
'userId': '00000000-0000-0000-0000-000000000000',
'StatusId': 0.0,
'createdOn': '0001-01-01T00:00:00',
'createdBy': '00000000-0000-0000-0000-000000000000',
'modifiedOn': null,
'modifiedBy': null,
'buildoutCompletedDate': null,
'buildoutDeadlineReason': null
}]";
return fakeData;
}
实际上我在 'FakeDefaultRoleSetting' json 方法中发送了虚拟数据,当我将其转换为真实数据时,问题就消失了。感谢大家的支持。