如何模拟哪个正在使用某些参数调用另一个方法?

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 方法中发送了虚拟数据,当我将其转换为真实数据时,问题就消失了。感谢大家的支持。