Hier ist eine gekürzte Version des Repo-Codes. Es ist immer noch etwas lang, aber haben Sie etwas Geduld.
NB: Ich habe den Zugriff von privat auf intern geändert, um dieses Beispiel einfacher zu machen. Normalerweise verwende ich Reflection oder eine erfasste Methode, um auf die private Methode zuzugreifen. Außerdem verwende ich Dapper, aber das ändert nichts am Problem.
Code: Select all
internal async Task GetCropsAsync(DbConnection connection, DbTransaction? transaction, Guid accountId, string? languageId)
{
var sqlBuilder = new SqlBuilder();
var cropName = "c.[name]";
var param = new Dictionary
{
{ "accountId", accountId }
};
if (!string.IsNullOrEmpty(languageId))
{
cropName = "isnull(lan.native_message, c.[name]) [name]";
param.Add(nameof(languageId), languageId);
}
var template = sqlBuilder.AddTemplate(
@$"SELECT
c.id
,c.last_modified
,{cropName}
,ISNULL(cl.[color_hex], c.[color_hex]) as ColorHex
,c.pounds_per_bushel
,c.lang_msg_id
FROM tblCrop c
/**leftjoin**/
/**where**/
/**orderby**/");
if (!string.IsNullOrEmpty(languageId))
{
sqlBuilder.LeftJoin($"dbo.tblLanguageMessageLocal lan ON lan.[message_id] = c.[lang_msg_id] AND lan.is_deleted = 0 AND lan.language_local_id = @{nameof(languageId)}");
}
sqlBuilder.LeftJoin("dbo.tblCropColor cl ON cl.crop_id = c.id and cl.is_deleted = 0 AND cl.account_id = @{nameof(@accountId)}");
sqlBuilder.Where("c.is_deleted = 0");
sqlBuilder.OrderBy("c.[name]");
var crops = await connection.QueryAsync(template.RawSql, param, transaction);
return crops;
}
Code: Select all
[Fact]
public async Task GetCropsAsync_ReturnsCrops_WithLanguageId()
{
// Arrange
var accountId = Guid.NewGuid();
var languageId = string.Empty;
var expectedCrops = new List
{
new Crop
{
Id = Guid.NewGuid(),
LastModified = DateTime.UtcNow,
Name = "Corn",
ColorHex = "#FFFF00",
PoundsPerBushel = 56,
LangMsgId = "msg1"
}
};
_mockConnection.SetupDapperAsync(x => x.QueryAsync(It.IsAny(), null, null, null, null)).ReturnsAsync(expectedCrops);**
// act
var result = await _repository.GetCropsAsync(_mockConnection.Object, _mockTransaction.Object, Guid.Empty, languageId);
// Assert
Assert.True(result != null &&
JsonConvert.SerializeObject(expectedCrops, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }) ==
JsonConvert.SerializeObject(result, new IsoDateTimeConverter() { DateTimeFormat = "yyyy-MM-dd HH:mm:ss" }));
}
Wenn wir außerdem eine Serviceklasse haben, die nichts anderes tut, als diese Methode aufzurufen, dann ist der Test dieser Klasse ebenfalls bedeutungslos.
Was habe ich übersehen?