2010-06-25 19 views
3

Je reçois error C3095: 'Xunit::Extensions::InlineDataAttribute': attribute cannot be repeated en code C++/CLI mais pas en C#.L'attribut ne peut pas être répété en C++/CLI mais OK en C#?

xUnit.net ressemble à la réponse à mes prières - un cadre de test unitaire moderne avec GUI travaillant avec C++/CLI. Cependant, l'utilisation de leur approche pour les tests paramétrés me donne l'erreur C3095 comme indiqué ci-dessous.

Des idées? J'utilise le dernier xUnit.net 1.6 avec Visual Studio 2008SP1.

using namespace Xunit; 
using namespace Xunit::Extensions; 

public ref class ParameterisedTestClass 
{ 
public: 

    [Theory] 
    [InlineData("Kilroy", 6)] 
    // uncomment to cause c3095 [InlineData("Jones", 5)] 
    void PropTest(String^ msg, int msgLen) 
    { 
     Assert::Equal(msg->Length, msgLen); 
    } 
}; 

l'équivalent en C# est bien

using Xunit; 
using Xunit.Extensions; 

public class ParameterisedTestClass 
{ 

    [Theory] 
    [InlineData("Kilroy", 6)] 
    [InlineData("Jones", 5)] 
    public void PropTest(String msg, int msgLen) 
    { 
     Assert.Equal(msg.Length, msgLen); 
    } 
}; 
+1

En utilisant ILDASM ou Reflector, quelle est la valeur de AttributeUsage de InlineDataAttribute? – Richard

+0

@Richard: Voir ma réponse, qui lie au dernier code source. Ils n'ont pas changé depuis 2008. –

+0

J'ai ouvert un bug ici: http://xunit.codeplex.com/workitem/9690 –

Répondre

6

Hmmm ... Je regardais les defs et herehere, et les reproduit (coupées) ci-dessous; l'héritage de AllowMultiple via DataAttribute fonctionne bien en C#:

class Test 
{ 
    [InlineData] 
    [InlineData] 
    static void Main() { } 
} 

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 
class DataAttribute : Attribute {} 

class InlineDataAttribute : DataAttribute { } 

Donc, si elle ne fonctionne pas pour C++/CLI, je suppose que C++/CLI est tout simplement pas le traitement de la [AttributeUsage] implicite. Vous devez déposer une demande contre Xunit en leur demandant de faire le [AttributeUsage] explicite sur InlineDataAttribute.

7

Je pense que cela est dû à l'héritage, et l'un des compilateurs se tromper.

InlineDataAttribute hérite de DataAttribute. Maintenant DataAttribute est déclarée pour permettre plusieurs instances:

[AttributeUsage(AttributeTargets.Method, AllowMultiple = true, Inherited = true)] 

mais InlineDataAttribute n'a pas de AttributeUsage explicite lui-même attribut. I suspect le compilateur C++ ne détecte pas le AllowMultiple hérité ... ou il est possible que ne doit pas être hérité. Je ne peux pas trouver une documentation détaillée sur l'héritage de AttributeUsageAttribute lui-même - bien qu'il ait Inherited=true, donc je suppose qu'il doit être héritée complètement par InlineDataAttribute ...

1

Je REPRO avec ce C++/CLI Snippet:

[AttributeUsage(AttributeTargets::All, AllowMultiple = true, Inherited = true)] 
ref class BaseAttribute : Attribute {}; 

ref class DerivedAttribute : BaseAttribute {}; 

[Derived] 
[Derived] // Error C3095 
ref class Test {}; 

Il est clair que ceci est un bogue dans le compilateur C++/CLI. Je ne le vois pas signalé à connect.microsoft.com. Le faire vous-même ne vaut probablement pas l'effort, la langue est en mode maintenance.

Les solutions de contournement possibles sont la modification du code source de xUnit pour assigner AllowMultiple à nouveau ou pour créer votre propre InlineDataFixedAttribute qui hérite de InlineDataAttribute.

+1

Pourquoi dites-vous "la langue est en mode maintenance?"Pour VS2010, le code C++ natif était le focus, en travaillant vers la prochaine version (ou peut-être même le prochain service pack) Je comprends que C++/CLI est le point de mire de l'équipe Visual C++.Certains ont promis de faire fonctionner Intellisense en C++/CLI à nouveau, implémenter C++ 0x (ce qui signifie que les méthodes anonymes et les fermetures en C++/CLI l'amènent à parité avec C# dans ces domaines), etc –

+1

Je suis avec Ben, tandis que C++/CLI a été relégué à être un «langage d'interopérabilité» en tant que tel, il est vital et je ne vois aucune raison pour qu'il s'en aille Dans une certaine mesure, me concentrer sur ce rôle m'a donné de l'espoir pour son avenir à long terme. mode "signifie qu'il n'obtiendra jamais de nouvelles fonctionnalités ou s'il sera corrigé de façon fiable - je serais plutôt content de ce dernier ;-) –