Ошибка асинхронного метода C # UnitTest - System.MissingMethodException: метод не найден: - PullRequest
0 голосов
/ 17 марта 2019

Привет, у меня есть проект оконных сервисов, который я уже успешно реализовал на сервере.Но я должен создать модульный тест, который я придерживался неделями, чтобы решить его.Кто-нибудь из вас, ребята, может мне помочь?

  • Я очищаю проект несколько раз, и возникает проблема, когда я пытаюсь настроить Mock на основе моего интерфейса

  • Я также несколько раз проводил рефакторинг кода, но не смог запустить unittest: (

Вот мой код:

Интерфейс

public interface IJobScheduler
{
    Task<HttpResponseMessage> GetASync(HttpClient client, string destination, CancellationTokenSource cancelToken);
    Task<bool> RunJobAgent(HttpClient client);
}

Класс (специально для ввода данных с использованием модульного теста)

public class JobSchedular
{
    private IJobScheduler iJobScheduler;

    public JobSchedular(IJobScheduler ijobscheduler) => iJobScheduler = ijobscheduler;

    public JobSchedular() => iJobScheduler = new JobSchedularSvc();
    public async Task<HttpResponseMessage> GetASync(HttpClient client, string destination, CancellationTokenSource cancelToken)
  {
    Task<HttpResponseMessage> result = iJobScheduler.GetASync(client, destination, cancelToken);
    return await result;
  }
}

Actual Class

    public partial class JobSchedularSvc : ServiceBase, IJobScheduler
    {   
        public async Task<HttpResponseMessage> GetASync(HttpClient client, string destination, CancellationTokenSource cancelToken)
        {
            try
            {
                HttpResponseMessage response;// = new HttpResponseMessage();
                using (client)
                {
                    response = await client.GetAsync(destination, cancelToken.Token);
                }

                return response;
            }
            catch (Exception ex)
            {
                LogHandler.InsertLog(LogLevel.Error, $"FAILED: GetAsync() - {ex.Message}", ex.StackTrace, "JobSchedulerSvc", "JobSchedulerSvc", null, null, null, null).Wait();
                return null;
            }

        }
}

Метод тестирования

   public async Task Test()
    {
        var message = new HttpResponseMessage(HttpStatusCode.OK);
        JobScheduler = new Mock<IJobScheduler>();

        JobScheduler.Setup(test => test.GetASync(It.IsAny<HttpClient>(), It.IsAny<string>(), It.IsAny<CancellationTokenSource>()))
            .Returns(Task.FromResult(new HttpResponseMessage() { StatusCode = HttpStatusCode.OK, Content = new StringContent("{'Result':true,'Exception':[]}") }));

        CancellationTokenSource cancelToken = new CancellationTokenSource();

        var response = new JobSchedular(JobScheduler.Object).GetASync(new HttpClient(), "/api/job/runjobagent", cancelToken);

        var result = await response.Result.Content.ReadAsStringAsync();

        Assert.AreEqual(result, "{'Result':true,'Exception':[]}");
    }

Я просто хочу вызвать локальную функцию GetAsync (), которая возвращает httpResponseMessage

1 Ответ

0 голосов
/ 18 марта 2019

Я редактирую файл .csproj и добавляю эту строку, она работает

<PropertyGroup>
  <AutoGenerateBindingRedirects>true</AutoGenerateBindingRedirects>
  <GenerateBindingRedirectsOutputType>true</GenerateBindingRedirectsOutputType>
</PropertyGroup> 
...