Asp.Net继承类单元测试(NUnit/XUnit)异常求助
Hey there! Let's tackle this issue you're facing. The error message "未为ExecEnv提供实现" tells us that your ObjectPageStep parent class is relying on an ExecEnv instance that doesn't exist in your unit test environment. Since removing the inheritance fixes the test, the problem is definitely tied to the parent class's initialization logic expecting ExecEnv to be available (which it probably gets automatically in your production app, but not in tests).
Here are actionable solutions to try:
1. Mock or Inject a Test-Friendly ExecEnv Instance
First, figure out how ExecEnv is used in ObjectPageStep:
- Is it injected via the parent class constructor?
- Is it accessed via a static property or service locator?
If it's constructor-injected, modify your EmptyPage to accept an ExecEnv parameter and pass a mocked instance in tests. Using a mocking library like Moq makes this straightforward:
Example Mock Setup:
// Update your EmptyPage class to pass the ExecEnv to the parent constructor public class EmptyPage : ObjectPageStep<EmptyPageViewModel> { public EmptyPage(ExecEnv execEnv) : base(execEnv) { } public void Prepare() { } public double AddNumber(double nombre1, double nombre2) => nombre1 + nombre2; } // In your test class using Moq; namespace test { [TestFixture] public class Class1 { private readonly Mock<ExecEnv> _mockExecEnv = new Mock<ExecEnv>(); private readonly EmptyPage vm = new EmptyPage(_mockExecEnv.Object); [Test] public void TestAddition() { double actAddNumberResult = vm.AddNumber(5, 7); Assert.That(actAddNumberResult, Is.EqualTo(12)); } } }
If ExecEnv uses a static accessor (like ExecEnv.Current), set a test instance before running tests:
[SetUp] public void Setup() { ExecEnv.Current = new TestExecEnv(); // Your custom test implementation }
2. Create a Minimal Test-Specific ExecEnv Implementation
If mocking isn't an option, build a simple test version of ExecEnv that satisfies the parent class's requirements. Just implement all required abstract members or provide empty stubs:
// Test-only ExecEnv implementation public class TestExecEnv : ExecEnv { // Override any abstract methods/properties with empty or test-specific logic public override SomeRequiredProperty { get; } = new SomeTestValue(); public override void SomeRequiredMethod() { } } // Use it in your test private readonly EmptyPage vm = new EmptyPage(new TestExecEnv());
3. Check for Framework Test Initialization Helpers
Many internal frameworks include utilities to set up test environments. Reach out to your team's framework maintainers or check internal docs for something like FrameworkTestInitializer.Init()—a method that pre-configures dependencies like ExecEnv for testing. Run this in your test's [SetUp] method to initialize the environment before tests execute.
4. Isolate the Independent Logic (Alternative Approach)
Since your AddNumber method doesn't depend on any parent class functionality, consider moving it to a separate, non-inherited utility class. This way, you can test the method without dealing with the ObjectPageStep dependency at all:
// New utility class public class NumberCalculator { public double AddNumber(double nombre1, double nombre2) => nombre1 + nombre2; } // Test this class instead [Test] public void TestAddition() { var calculator = new NumberCalculator(); double actAddNumberResult = calculator.AddNumber(5, 7); Assert.That(actAddNumberResult, Is.EqualTo(12)); }
This is a clean solution if the method doesn't need to be part of EmptyPage.
内容的提问来源于stack exchange,提问作者mehdi bennie

