Ich habe eine einfache Steuerung, die Einheit getestet werden muss nicht Integration getestet. Ich brauche nur einen Weg, um zu verhöhnen, so dass ich überprüfen kann, ob die receive-Methode aufgerufen wird. Wir haben bereits einen Test gegen Receive(), also brauchen wir nicht zu überprüfen, was in dieser Methode passiert.Mock eine Steuerung für Komponententest ohne Service-Referenz C#
Mein Code sieht aus wie
public class MessageController : Controller
{
private readonly ConnectionDetail connectionDetail;
private readonly QueueDetail queueDetail;
public MessageController(IOptions<ConnectionDetail> connectionDetail, IOptions<QueueDetail> queueDetail)
{
this.connectionDetail = connectionDetail.Value;
this.queueDetail = queueDetail.Value;
}
[HttpGet()]
public IActionResult Get()
{
try
{
var channel = CreateConnectionAndChannel(queueDetail);
var message = channel.Receive();
var hbaseKey = new HbaseKey { Key = new Guid(message) };
return Ok(hbaseKey);
}
catch
{
return StatusCode(500, "Exception occured while processing. Try again.");
}
}
private IChannel CreateConnectionAndChannel(QueueDetail queueDetail)
{
var factory = new Factory();
var adapter = factory.Connect(MessagingType.MQ, connectionDetail);
return adapter.BindQueue(queueDetail);
}
}
Sie haben eine 'neue Fabrik()' dort aussehen könnte. Im Allgemeinen ist jeder Code, der 'new' enthält, nicht testbar. Sie müssen eine "IFactoryFactory" injizieren, fürchte ich. – CodeCaster
Sie sollten die 'CreateConnectionAndChannel'-Funktionalität als Teil einer anderen Klasse haben und diese sollte als Abhängigkeit zum Controller injiziert werden. Und Unit-Tests sollten dies zusammen mit anderen Mocks zu Unit-Test-Controller verwenden –
@CodeCaster - Das ist, was ich dachte :( – Developer