Sind diese Unit-Tests mit Moq-Tests irgendetwas?C#

Ein Treffpunkt für C#-Programmierer
Anonymous
 Sind diese Unit-Tests mit Moq-Tests irgendetwas?

Post by Anonymous »

Ich versuche, eine Repository-Methode mithilfe eines MOQ mit einem Setup im Test zu testen. Soweit ich das beurteilen kann, testet dies nicht die Methode, sondern nur den Test.
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;
}
Der Test, den ich dafür eingerichtet habe, verwendet ein Moq und verwendet Setup, um zu vermeiden, dass tatsächlich auf die Datenbank zugegriffen wird...

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" }));
}
Mein Argument ist, dass die gesamte frühere Logik (die if-Anweisungen) effektiv ignoriert wird, da wir dem Aufruf von QueryAsync mitteilen, was zurückgegeben werden soll. Tatsächlich gibt diese Methode immer den moq'd-Wert zurück.
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?

Quick Reply

Change Text Case: 
   
  • Similar Topics
    Replies
    Views
    Last post