/// <summary> /// Finds the tests on a test method. /// </summary> /// <param name="testMethod">The test method.</param> /// <param name="includeSourceInformation">Set to <c>true</c> to indicate that source information should be included.</param> /// <param name="messageBus">The message bus to report discovery messages to.</param> /// <param name="discoveryOptions">The options used by the test framework during discovery.</param> /// <returns>Return <c>true</c> to continue test discovery, <c>false</c>, otherwise.</returns> protected virtual bool FindTestsForMethod(ITestMethod testMethod, bool includeSourceInformation, IMessageBus messageBus, ITestFrameworkDiscoveryOptions discoveryOptions) { var factAttributes = testMethod.Method.GetCustomAttributes(typeof(FactAttribute)).CastOrToList(); if (factAttributes.Count > 1) { var message = string.Format("Test method '{0}.{1}' has multiple [Fact]-derived attributes", testMethod.TestClass.Class.Name, testMethod.Method.Name); var testCase = new ExecutionErrorTestCase(DiagnosticMessageSink, TestMethodDisplay.ClassAndMethod, testMethod, message); return ReportDiscoveredTestCase(testCase, includeSourceInformation, messageBus); } var factAttribute = factAttributes.FirstOrDefault(); if (factAttribute == null) return true; var testCaseDiscovererAttribute = factAttribute.GetCustomAttributes(typeof(XunitTestCaseDiscovererAttribute)).FirstOrDefault(); if (testCaseDiscovererAttribute == null) return true; var args = testCaseDiscovererAttribute.GetConstructorArguments().Cast<string>().ToList(); var discovererType = SerializationHelper.GetType(args[1], args[0]); if (discovererType == null) return true; var discoverer = GetDiscoverer(discovererType); if (discoverer == null) return true; foreach (var testCase in discoverer.Discover(discoveryOptions, testMethod, factAttribute)) if (!ReportDiscoveredTestCase(testCase, includeSourceInformation, messageBus)) return false; return true; }
/// <summary> /// Finds the tests on a test method. /// </summary> /// <param name="testMethod">The test method.</param> /// <param name="includeSourceInformation">Set to <c>true</c> to indicate that source information should be included.</param> /// <param name="messageBus">The message bus to report discovery messages to.</param> /// <param name="discoveryOptions">The options used by the test framework during discovery.</param> /// <returns>Return <c>true</c> to continue test discovery, <c>false</c>, otherwise.</returns> protected internal virtual bool FindTestsForMethod(ITestMethod testMethod, bool includeSourceInformation, IMessageBus messageBus, ITestFrameworkDiscoveryOptions discoveryOptions) { var factAttributes = testMethod.Method.GetCustomAttributes(typeof(FactAttribute)).CastOrToList(); if (factAttributes.Count > 1) { var message = $"Test method '{testMethod.TestClass.Class.Name}.{testMethod.Method.Name}' has multiple [Fact]-derived attributes"; var testCase = new ExecutionErrorTestCase(DiagnosticMessageSink, TestMethodDisplay.ClassAndMethod, TestMethodDisplayOptions.None, testMethod, message); return(ReportDiscoveredTestCase(testCase, includeSourceInformation, messageBus)); } var factAttribute = factAttributes.FirstOrDefault(); if (factAttribute == null) { return(true); } var factAttributeType = (factAttribute as IReflectionAttributeInfo)?.Attribute.GetType(); Type discovererType = null; if (factAttributeType == null || !DiscovererTypeCache.TryGetValue(factAttributeType, out discovererType)) { var testCaseDiscovererAttribute = factAttribute.GetCustomAttributes(typeof(XunitTestCaseDiscovererAttribute)).FirstOrDefault(); if (testCaseDiscovererAttribute != null) { var args = testCaseDiscovererAttribute.GetConstructorArguments().Cast <string>().ToList(); discovererType = SerializationHelper.GetType(args[1], args[0]); } if (factAttributeType != null) { DiscovererTypeCache[factAttributeType] = discovererType; } } if (discovererType == null) { return(true); } var discoverer = GetDiscoverer(discovererType); if (discoverer == null) { return(true); } foreach (var testCase in discoverer.Discover(discoveryOptions, testMethod, factAttribute)) { if (!ReportDiscoveredTestCase(testCase, includeSourceInformation, messageBus)) { return(false); } } return(true); }
/// <inheritdoc/> public IEnumerable<IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute) { var methodDisplay = discoveryOptions.MethodDisplayOrDefault(); IXunitTestCase testCase; if (testMethod.Method.GetParameters().Any()) testCase = new ExecutionErrorTestCase(diagnosticMessageSink, methodDisplay, testMethod, "[Fact] methods are not allowed to have parameters. Did you mean to use [Theory]?"); else testCase = new XunitTestCase(diagnosticMessageSink, methodDisplay, testMethod); return new[] { testCase }; }
/// <summary> /// Finds the tests on a test method. /// </summary> /// <param name="testMethod">The test method.</param> /// <param name="includeSourceInformation">Set to <c>true</c> to indicate that source information should be included.</param> /// <param name="messageBus">The message bus to report discovery messages to.</param> /// <param name="discoveryOptions">The options used by the test framework during discovery.</param> /// <returns>Return <c>true</c> to continue test discovery, <c>false</c>, otherwise.</returns> protected virtual bool FindTestsForMethod(ITestMethod testMethod, bool includeSourceInformation, IMessageBus messageBus, ITestFrameworkDiscoveryOptions discoveryOptions) { var factAttributes = testMethod.Method.GetCustomAttributes(typeof(FactAttribute)).CastOrToList(); if (factAttributes.Count > 1) { var message = string.Format("Test method '{0}.{1}' has multiple [Fact]-derived attributes", testMethod.TestClass.Class.Name, testMethod.Method.Name); var testCase = new ExecutionErrorTestCase(DiagnosticMessageSink, TestMethodDisplay.ClassAndMethod, testMethod, message); return(ReportDiscoveredTestCase(testCase, includeSourceInformation, messageBus)); } var factAttribute = factAttributes.FirstOrDefault(); if (factAttribute == null) { return(true); } var testCaseDiscovererAttribute = factAttribute.GetCustomAttributes(typeof(XunitTestCaseDiscovererAttribute)).FirstOrDefault(); if (testCaseDiscovererAttribute == null) { return(true); } var args = testCaseDiscovererAttribute.GetConstructorArguments().Cast <string>().ToList(); var discovererType = SerializationHelper.GetType(args[1], args[0]); if (discovererType == null) { return(true); } var discoverer = GetDiscoverer(discovererType); if (discoverer == null) { return(true); } foreach (var testCase in discoverer.Discover(discoveryOptions, testMethod, factAttribute)) { if (!ReportDiscoveredTestCase(testCase, includeSourceInformation, messageBus)) { return(false); } } return(true); }
/// <inheritdoc/> public IEnumerable <IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute) { var methodDisplay = discoveryOptions.MethodDisplayOrDefault(); IXunitTestCase testCase; if (testMethod.Method.GetParameters().Any()) { testCase = new ExecutionErrorTestCase(diagnosticMessageSink, methodDisplay, testMethod, "[Fact] methods are not allowed to have parameters. Did you mean to use [Theory]?"); } else { testCase = new XunitTestCase(diagnosticMessageSink, methodDisplay, testMethod); } return(new[] { testCase }); }
/// <summary> /// Discover test cases from a test method. By default, if the method is generic, or /// it contains arguments, returns a single <see cref="ExecutionErrorTestCase"/>; /// otherwise, it returns the result of calling <see cref="CreateTestCase"/>. /// </summary> /// <param name="discoveryOptions">The discovery options to be used.</param> /// <param name="testMethod">The test method the test cases belong to.</param> /// <param name="factAttribute">The fact attribute attached to the test method.</param> /// <returns>Returns zero or more test cases represented by the test method.</returns> public virtual IEnumerable <IXunitTestCase> Discover(ITestFrameworkDiscoveryOptions discoveryOptions, ITestMethod testMethod, IAttributeInfo factAttribute) { IXunitTestCase testCase; if (testMethod.Method.GetParameters().Any()) { testCase = new ExecutionErrorTestCase(DiagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod, "[Fact] methods are not allowed to have parameters. Did you mean to use [Theory]?"); } else if (testMethod.Method.IsGenericMethodDefinition) { testCase = new ExecutionErrorTestCase(DiagnosticMessageSink, discoveryOptions.MethodDisplayOrDefault(), testMethod, "[Fact] methods are not allowed to be generic."); } else { testCase = CreateTestCase(discoveryOptions, testMethod, factAttribute); } return(new[] { testCase }); }