Ich schreibe einen kleinen Wrapper (MyWrapper
) für den Einsatz in Komponententests. Sein Zweck besteht darin, Testcode mit einem try-catch zu umhüllen, um eine bestimmte Ausnahme zu erfassen (MySpecialException
) und dann den Test zu ignorieren.Wie kann verhindert werden, dass ein Aktionsparameter ein asynchrones Lambda ist?
Warum sollte ich das für diese Frage nicht relevant sein.
den Code unten gegeben, wie kann ich andere aus Leiten eines Action
und mit Asynchron wie dies zu verhindern? Oder mit anderen Worten: Wie zwinge ich sie stattdessen, MyWrapper.ExecuteAsync(Func<Task>)
zu verwenden?
using System;
using System.Threading.Tasks;
using NUnit.Framework;
namespace PreventAsyncActionLambdaExample
{
[TestFixture]
public class Example
{
[Test]
public async Task ExampleTest()
{
// How do I prevent others from passing an action and using async like this?
// Or in other words: How do I force them to use MyWrapper.ExecuteAsync(Func<Task>) instead?
MyWrapper.Execute(async() =>
{
var cut = new ClassUnderTest();
await cut.DoSomethingAsync();
Assert.Fail("Problem: This line will never be reached");
});
}
}
public static class MyWrapper
{
// This method SHOULD NOT, BUT WILL be used in this example
public static void Execute(Action action)
{
try
{
action();
}
catch (MySpecialException)
{
Assert.Ignore("Ignored due to MySpecialException");
}
}
// This method SHOULD BE USED in this example, BUT WILL NOT be used.
public static async Task ExecuteAsync(Func<Task> func)
{
try
{
await func();
}
catch (MySpecialException)
{
Assert.Ignore("Ignored due to MySpecialException");
}
}
}
public class MySpecialException : Exception
{
// This is another exception in reality which is not relevant for this example
}
public class ClassUnderTest
{
public Task DoSomethingAsync()
{
return Task.Delay(20); // Simulate some work
}
}
}
Es gibt so etwas wie eine 'async' Methode nicht. Dieses Schlüsselwort ist nur syntaktischer Zucker, der es dem Compiler ermöglicht, eine Zustandsmaschine zu erzeugen. Das Problem hierbei ist, dass das Lambda eine 'async void' ist, dh nur eine' void' Methode, die nicht erwartet werden kann. Es ist * nur eine Aktion, was die Methodenauflösung betrifft. Wenn es sich um eine Async-Task handelt, können Sie 'Execute' nicht verwenden. –
Um es anders auszudrücken: Async() => {}' wie jede Async-Lücke kann nicht erwartet werden, also ist es nicht Es ist nicht möglich, 'ExecuteAsync' zu verwenden. –
@ PanagiotisKanavos Aber das ist, was ich in anderen Tests tue so: 'erwarten MyWrapper.Execute (async() => {...}' – ChrisM