diff --git a/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs b/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs index 8510093..84eb39e 100644 --- a/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs +++ b/CS/XAFUnitTestEFCore/XAFUnitTestEFCore.Module/Controllers/CreateLinkedSaleBaseDescendantController.cs @@ -28,6 +28,6 @@ public void CreateLinkedSaleBase(IObjectSpace objectSpace, SaleBase createdObjec } protected override void OnDeactivated() { base.OnDeactivated(); - newObjectController.ObjectCreated += CreateLinkedSaleBaseDescendantController_ObjectCreated; + newObjectController.ObjectCreated -= CreateLinkedSaleBaseDescendantController_ObjectCreated; } -} \ No newline at end of file +} diff --git a/README.md b/README.md new file mode 100644 index 0000000..6ccbac5 --- /dev/null +++ b/README.md @@ -0,0 +1,52 @@ +# XAF - How to Unit Test Controllers, Actions, and Business Logic (EF Core) + +This example creates unit tests for an Entity Framework Core ORM-powered XAF application. The solution illustrates best practices for testing XAF Controllers, Actions, business object behavior, and security-related usage scenarios via [xUnit](https://www.nuget.org/packages/xunit/) and [Moq](https://www.nuget.org/packages/Moq/). + +## Implementation Details + +The E2E test project addresses the following testing patterns: + +| Test Class | What It Tests | +|---|---| +| [`ActionsInViewTests`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/ActionsInViewTests.cs) | The test checks action enable and disable behavior based on `TargetObjectsCriteria` and `SelectionDependencyType` in Detail and List Views. | +| [`SetTaskActionExecuteTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionExecuteTest.cs) | The test runs a `SingleChoiceAction` and updates properties on selected objects. | +| [`SetTaskActionStateTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionStateTest.cs) | The test evaluates action state based on security permissions through `ISecurityStrategyBase`. | +| [`FindBySubjectActionExecuteTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/FindBySubjectActionExecuteTest.cs) | The test runs a `ParametrizedAction` that finds and displays an object by criteria. | +| [`CreateLinkedSaleBaseDescendantControllerTest`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CreateLinkedSaleBaseDescendantControllerTest.cs) | The test verifies event subscription and copies properties from parent objects to child objects in nested frames. | +| [`CaptionHelperTests`](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CaptionHelperTests.cs) | The test sets up `CaptionHelper` localization through `ModelApplication` and `ExpressApplicationSetupParameters`. | + +### Testing Actions in Views (Mocking Approach) + +The tests mock `IObjectSpace`, `XafApplication`, `Frame`, and View objects (`DetailView`/`ListView`) to evaluate action behavior without running the full application. Key mocking patterns include: + +- Mocking `IObjectSpace` and its LINQ query methods for object retrieval. +- Creating `DetailView`/`ListView` instances with mocked `CollectionSource` and `ListEditor`. +- Setting up `Frame` objects to activate controllers and register actions. +- Verifying `CommitChanges()` is called after action execution. + +### Testing Security-Dependent Logic + +`SetTaskActionStateTest` demonstrates how to mock `ISecurityStrategyBase` to simulate granted or denied field-level permissions and verify that action state reflects the current user's access rights. + +### Testing Event Subscriptions + +`CreateLinkedSaleBaseDescendantControllerTest` uses reflection to verify that a controller correctly subscribes to the `NewObjectViewController.ObjectCreated` event. + +## Files to Review + +- [ActionsInViewTests.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/ActionsInViewTests.cs) +- [SetTaskActionExecuteTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionExecuteTest.cs) +- [SetTaskActionStateTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/SetTaskActionStateTest.cs) +- [FindBySubjectActionExecuteTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/FindBySubjectActionExecuteTest.cs) +- [CreateLinkedSaleBaseDescendantControllerTest.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CreateLinkedSaleBaseDescendantControllerTest.cs) +- [CaptionHelperTests.cs](CS/XAFUnitTestEFCore/XAFUnitTestEFCore.E2E.Tests/CaptionHelperTests.cs) + +## Documentation + +- [EF Core Unit Tests](https://docs.devexpress.com/eXpressAppFramework/405947/debugging-testing-and-error-handling/ef-core-unit-tests) + +## Does this example address your development requirements/scenarios? + +[](https://www.devexpress.com/support/examples/survey.xml?utm_source=github&utm_campaign=XAF_unit-test-ef-core&utm_term=yes) [](https://www.devexpress.com/support/examples/survey.xml?utm_source=github&utm_campaign=XAF_unit-test-ef-core&utm_term=no) + +(you will be redirected to DevExpress.com to submit your response)