我對 Moq 和 NUnit 不是很熟悉,這就是我在這方面苦苦掙扎的原因。我將 Dapper 用于我的通用存盤庫,它已被注入到服務中,然后用于實作邏輯。我的問題是我在 LinQ 的 Select 中使用它來傳遞來自前一個物件的引數。我不知道如何在模擬中反映這一點......
這是我的服務:
public class StudyService: IStudyService
{
private readonly ILogger<StudyService> _logger;
private readonly IDataRepository _dataRepository;
public StudyService(ILogger<StudyService> logger, IDataRepository dataRepository)
{
_logger = logger;
_dataRepository = dataRepository;
}
[...]
// This is the method to test:
public async Task<StudiesResponse> GetAllStudies()
{
StudiesResponse studies = new StudiesResponse();
List<StudyReponse> list = new List<StudyReponse>();
foreach (StudyDAO study in await _dataRepository.GetEntitiesAsync<StudyDAO>())
{
StudyReponse resp = new StudyReponse()
{
StudyCode = study.StudyCode,
Participators = _dataRepository.GetEntitiesAsync<RoleUserDAO>(new { @StudyId = study.Id }).Result.Select(x => new ParticipatorsResponse()
{
UserEmail = _dataRepository.GetEntityAsync<UserDAO>(new { @Id = x.Id }).Result.Email,
RoleName = _dataRepository.GetEntityAsync<RoleDAO>(new { @Id = x.Id }).Result.Name
})
};
list.Add(resp);
}
studies.Studies = list;
return studies;
}
[...]
}
}
正如您所看到的,檢索 UserEmail 和 RoleName 的呼叫是由前面的“_dataRepository.GetEntitiesAsync”的 Select 提供的,這就是我不知道如何模擬的內容......
這是我的通用/匿名存盤庫:
public class DataRepository : IDataRepository
{
private readonly IConfiguration _configuration;
public DataRepository(IConfiguration configuration)
{
_configuration = configuration;
}
public async Task<IEnumerable<T>> GetEntitiesAsync<T>()
{
using(IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("SqlConnection")))
{
return await conn.GetListAsync<T>();
}
}
public async Task<IEnumerable<T>> GetEntitiesAsync<T>(object query)
{
using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("SqlConnection")))
{
return await conn.GetListAsync<T>(query);
}
}
public async Task<T> GetEntityAsync<T>(object query)
{
using (IDbConnection conn = new SqlConnection(_configuration.GetConnectionString("SqlConnection")))
{
IEnumerable<T> result = await conn.GetListAsync<T>(query);
return result.FirstOrDefault();
}
}
[...]
這是我的測驗課:
[TestFixture]
public class Tests
{
IEnumerable<StudyDAO> _studies;
IEnumerable<UserDAO> _users;
IEnumerable<RoleDAO> _roles;
IEnumerable<RoleUserDAO> _roleUsers;
[SetUp]
public void Setup()
{
_studies = MockedDAOs.GetMockedStudies();
_users = MockedDAOs.GetMockedUsers();
_roles = MockedDAOs.GetMockedRoles();
_roleUsers = MockedDAOs.GetMockedRoleUsers();
}
[Test]
public void GetAllStudiesTest()
{
var _data = new Mock<IDataRepository>();
_data.Setup(m => m.GetEntitiesAsync<StudyDAO>()).Returns(Task.FromResult(_studies));
_data.Setup(m => m.GetEntitiesAsync<RoleUserDAO>(It.IsAny<Object>())).Returns(Task.FromResult(_roleUsers));
_data.Setup(m => m.GetEntityAsync<UserDAO>(It.IsAny<Object>())).Returns(Task.FromResult(_users.Where(u => u.Id ==????)));
_data.Setup(m => m.GetEntityAsync<RoleDAO>(It.IsAny<Object>())).Returns(Task.FromResult(_roles.Where(u => u.Id ==????)));
var _logger = Mock.Of<ILogger<StudyService>>();
StudyService _service = new StudyService(_logger, _data.Object);
var result = _service.GetAllStudies();
Assert.Pass();
}
}
這是我的“模擬”資料建構式:
public static class MockedDAOs
{
public static IEnumerable<UserDAO> GetMockedUsers()
{
List<UserDAO> users = new List<UserDAO>();
users.Add(new UserDAO()
{
Id = 1,
Email = "[email protected]",
Address = "Alderaan Sector 1234",
LanguajePreference = "English",
UpdateUser = "Admin"
});
users.Add(new UserDAO()
{
Id = 2,
Email = "[email protected]",
Address = "Alderaan Sector 1233",
LanguajePreference = "English",
UpdateUser = "Admin"
});
users.Add(new UserDAO()
{
Id = 3,
Email = "[email protected]",
Address = "Alderaan Sector 1232",
LanguajePreference = "English",
UpdateUser = "Admin"
});
users.Add(new UserDAO()
{
Id = 4,
Email = "[email protected]",
Address = "Alderaan Sector 1231",
LanguajePreference = "English",
UpdateUser = "Admin"
});
return users;
}
public static IEnumerable<StudyDAO> GetMockedStudies()
{
List<StudyDAO> studies = new List<StudyDAO>();
studies.Add(new StudyDAO()
{
Id = 1,
StudyCode = "order66",
Company = "Galactic Empire",
UpdateUser = "Admin"
});
return studies;
}
public static IEnumerable<RoleDAO> GetMockedRoles()
{
List<RoleDAO> roles = new List<RoleDAO>();
roles.Add(new RoleDAO()
{
Id = 1,
Name = "General Director",
Curriculum = "Ruthless Management I",
UpdateUser = "Admin"
});
roles.Add(new RoleDAO()
{
Id = 2,
Name = "CEO",
Curriculum = "Smoke and Mirrors I",
UpdateUser = "Admin"
});
roles.Add(new RoleDAO()
{
Id = 3,
Name = "Strategy Director",
Curriculum = "Detecting Critical Targets",
UpdateUser = "Admin"
});
roles.Add(new RoleDAO()
{
Id = 4,
Name = "Deliver",
Curriculum = "Silent Aproaches",
UpdateUser = "Admin"
});
return roles;
}
public static IEnumerable<RoleUserDAO> GetMockedRoleUsers()
{
List<RoleUserDAO> roleUsers = new List<RoleUserDAO>();
roleUsers.Add(new RoleUserDAO()
{
Id = 1,
UserId = 1,
RoleId = 1,
StudyId = 1,
UpdateUser = "Admin"
});
roleUsers.Add(new RoleUserDAO()
{
Id = 2,
UserId = 2,
RoleId = 2,
StudyId = 1,
UpdateUser = "Admin"
});
roleUsers.Add(new RoleUserDAO()
{
Id = 3,
UserId = 3,
RoleId = 3,
StudyId = 1,
UpdateUser = "Admin"
});
roleUsers.Add(new RoleUserDAO()
{
Id = 4,
UserId = 4,
RoleId = 4,
StudyId = 1,
UpdateUser = "Admin"
});
return roleUsers;
}
public static StudiesResponse GetMockedStudiesResponse()
{
List<ParticipatorsResponse> participatorsResponse = new List<ParticipatorsResponse>();
participatorsResponse.Add(new ParticipatorsResponse(){
UserEmail = "[email protected]",
RoleName = "General Director"
});
participatorsResponse.Add(new ParticipatorsResponse()
{
UserEmail = "[email protected]",
RoleName = "CEO"
});
participatorsResponse.Add(new ParticipatorsResponse()
{
UserEmail = "[email protected]",
RoleName = "Strategy Director"
});
participatorsResponse.Add(new ParticipatorsResponse()
{
UserEmail = "[email protected]",
RoleName = "Deliver"
});
List<StudyReponse> studyResponse = new List<StudyReponse>();
studyResponse.Add(new StudyReponse()
{
StudyCode = "order66",
Participators = participatorsResponse
});
return new StudiesResponse()
{
Studies = studyResponse
};
}
}
我沒有想法,我找不到像這樣的場景的任何例子......
編輯:好的,我發現了一篇我認為可以使用的帖子:
測驗:
[Test]
public void GetAllStudiesTest()
{
var _data = new Mock<IDataRepository>();
_data.Setup(m => m.GetEntitiesAsync<StudyDAO>()).Returns(Task.FromResult(_studies));
_data.Setup(m => m.GetEntitiesAsync<RoleUserDAO>(It.IsAny<Object>())).ReturnsAsync((Object obj) => _roleUsers.Where(x => x.Id == obj.Id));
_data.Setup(m => m.GetEntityAsync<UserDAO>(It.IsAny<Object>())).ReturnsAsync((Object obj) => _users.Where(x => x.Id == obj.Id).FirstOrDefault());
_data.Setup(m => m.GetEntityAsync<RoleDAO>(It.IsAny<Object>())).ReturnsAsync((Object obj) => _roles.Where(x => x.Id == obj.Id).FirstOrDefault());
var _logger = Mock.Of<ILogger<StudyService>>();
StudyService _service = new StudyService(_logger, _data.Object);
var result = _service.GetAllStudies();
Assert.True(comparator.Compare(result, MockedDAOs.GetMockedStudiesResponse()).AreEqual);
}
但它不起作用。使用此代碼,恢復 IEnumerable 的第一次呼叫回傳 0 個結果......我會繼續尋找。任何幫助將不勝感激。
uj5u.com熱心網友回復:
我設法解決了這個問題。測驗的正確代碼是:
[Test]
public void GetAllStudiesTest()
{
var _data = new Mock<IDataRepository>();
_data.Setup(m => m.GetEntitiesAsync<StudyDAO>()).Returns(Task.FromResult(_studies));
_data.Setup(m => m.GetEntitiesAsync<RoleUserDAO>(It.IsAny<Object>())).ReturnsAsync((Object obj) => _roleUsers.Where(x => x.StudyId == (int)obj.GetType().GetProperty("StudyId").GetValue(obj, null)));
_data.Setup(m => m.GetEntityAsync<UserDAO>(It.IsAny<Object>())).ReturnsAsync((Object obj) => _users.Where(x => x.Id == (int)obj.GetType().GetProperty("Id").GetValue(obj, null)).FirstOrDefault());
_data.Setup(m => m.GetEntityAsync<RoleDAO>(It.IsAny<Object>())).ReturnsAsync((Object obj) => _roles.Where(x => x.Id == (int)obj.GetType().GetProperty("Id").GetValue(obj, null)).FirstOrDefault());
var _logger = Mock.Of<ILogger<StudyService>>();
StudyService _service = new StudyService(_logger, _data.Object);
StudiesResponse result = _service.GetAllStudies().Result;
StudiesResponse expectedResult = MockedDAOs.GetMockedStudiesResponse();
var comparation = comparator.Compare(result, expectedResult);
Assert.True(comparation.AreEqual);
}
如您所見,我正在使用KellermanSoftware.CompareNetObjects進行斷言,這就是為什么我必須修改測驗方法,將參與者從 LinQ WhereSelect 回應決議為串列,因此比較器不會看到與我構造的差異預期的反應。
這是略有不同的方法代碼:
public async Task<StudiesResponse> GetAllStudies()
{
StudiesResponse studies = new StudiesResponse();
List<StudyReponse> list = new List<StudyReponse>();
foreach (StudyDAO study in await _dataRepository.GetEntitiesAsync<StudyDAO>())
{
StudyReponse resp = new StudyReponse()
{
StudyCode = study.StudyCode,
Participators = _dataRepository.GetEntitiesAsync<RoleUserDAO>(new { @StudyId = study.Id }).Result.Select(x => new ParticipatorsResponse()
{
UserEmail = _dataRepository.GetEntityAsync<UserDAO>(new { @Id = x.Id }).Result.Email,
RoleName = _dataRepository.GetEntityAsync<RoleDAO>(new { @Id = x.Id }).Result.Name
}).ToList()
};
list.Add(resp);
}
studies.Studies = list;
return studies;
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/494203.html
