System.Action не известен в UnitTest до явного определения - PullRequest
1 голос
/ 29 марта 2011

Я получил эту странную проблему, когда System.Action не может быть решена, если она явно не определена выше Чтобы объяснить это лучше, я покажу вам код

    [TestMethod]
    public void Channel_Dispatch_Waits_Before_Return()
    {
        //Action useless = null;

        WorkflowChannel channel = new WorkflowChannel();
        bool isHandeled = false;

        channel.Subscribe(WorkflowHandlerFactory.FromLambdaAsync<int>((data, callback, onError) =>
        {
            // Go on another thread and sleep for a small ammount of time to simulate a async request
            System.Threading.ThreadPool.QueueUserWorkItem(state =>
            {
                System.Threading.Thread.Sleep(100);

                isHandeled = true;

                callback();
            });
        }));


        channel.Dispatch(1);

        Assert.IsTrue(isHandeled);
    }

Это дает ошибку времени компиляции, а именно:

Ошибка 1 Делегат «Действие» не принимает 0 аргументов C: \ Users *** \ Documents \ Visual Studio 2010 \ Projects \ MessageWorkflow \ MessageWorkfow.Test \ WorkflowChannelTest.cs 47 21 MessageWorkflow.Test

Однако, когда я раскомментирую строку:

Action useless = null;

Это не дает ошибку времени компиляции. Я пытался восстановить и т. Д., Но бесполезно. Если требуется, объявление: FromLambdaAsync:

public static IWorkflowHandler FromLambdaAsync<T>(AsyncAction<T> method)

Где AsyncAction:

public delegate void AsyncAction<T>(T message, Action onComplete, Action<Exception> onError);

Это не шоу-стоппер, но я в замешательстве, так как не могу найти никакой логики за этим ... Кто может дать мне пощечину?

Ура!

* РЕДАКТИРОВАТЬ *

Мне удалось воспроизвести это поведение в самом простом тестовом примере, см .:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ClassLibrary2
{
    public delegate void AsyncAction(Action onComplete);

    public class WorkflowHandler
    {

    }

    public class Main
    {
        public static WorkflowHandler FromLambdaAsync(AsyncAction method)
        {
            return new WorkflowHandler();
        }
    }
}

С модульным тестом:

using ClassLibrary2;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System;

namespace TestProject1
{
    [TestClass]
    public class MainTest
    {
        [TestMethod()]
        public void FromLambdaAsyncTest()
        {
            Main.FromLambdaAsync((callback) =>
                {
                    callback();
                });
        }
    }
}

Что дает мне ту же ошибку

Проект компилируется с использованием .NET 4.0 usign VS 2010 sp1

* РЕДАКТИРОВАТЬ 2: *

Упрощение теста еще больше, без изменений в результате

* РЕДАКТИРОВАТЬ 3 *

Даже в самом простом тестовом случае это не сработает, см .:

[TestMethod()]
public void FromLambdaAsyncTest()
{
    AsyncAction action = c => c();
}

1 Ответ

1 голос
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...