0

I'm using Zenject for UnityEngine project and I'm trying to write a unit test for my MenuSystem class but I'm constantly getting error System.Security.SecurityException : ECall methods must be packaged into a system module.

This is the stack trace:

Stack Trace: 
ProfileBlock.Start(String sampleName)
TypeAnalyzer.TryGetInfo(Type type) line 128
DiContainer.InstantiateInternal(Type concreteType, Boolean autoInject, List`1 extraArgs, InjectContext context, Object concreteIdentifier) line 1288
DiContainer.InstantiateExplicit(Type concreteType, Boolean autoInject, List`1 extraArgs, InjectContext context, Object concreteIdentifier) line 3303
TransientProvider.GetAllInstancesWithInjectSplit(InjectContext context, List`1 args, Action& injectAction, List`1 buffer) line 67
CachedProvider.GetAllInstancesWithInjectSplit(InjectContext context, List`1 args, Action& injectAction, List`1 buffer) line 100
IProviderExtensions.GetAllInstances(IProvider creator, InjectContext context, List`1 args, List`1 buffer) line 31
IProviderExtensions.GetAllInstances(IProvider creator, InjectContext context, List`1 buffer) line 22
DiContainer.GetDecoratedInstances(IProvider provider, InjectContext context, List`1 buffer) line 1199
DiContainer.SafeGetInstances(ProviderInfo providerInfo, InjectContext context, List`1 instances) line 1128
DiContainer.Resolve(InjectContext context) line 1053
DiContainer.ResolveId(Type contractType, Object identifier) line 2433
DiContainer.Resolve(Type contractType) line 2420
DiContainer.Resolve[TContract]() line 2415
MenuSystemTests.Setup() line 28

This is my test class:

using ArenaClient;
using ArenaClient.UI;
using NSubstitute;
using Zenject;

namespace ArenaClientTests
{
    [TestFixture]
    public class MenuSystemTests
    {
        private DiContainer _container;
        private MenuSystem _menuSystem;

        private IMenuViewController _menuViewController;
        private ISettingsViewController _settingsViewController;

        [SetUp]
        public void Setup()
        {
            _container = new DiContainer();
            _menuViewController = Substitute.For<IMenuViewController>();
            _settingsViewController = Substitute.For<ISettingsViewController>();

            _container.Bind<IMenuViewController>().FromInstance(_menuViewController);
            _container.Bind<ISettingsViewController>().FromInstance(_settingsViewController);
            _container.Bind<MenuSystem>().AsSingle();

            _menuSystem = _container.Resolve<MenuSystem>();
        }

        [Test]
        public void Init_ShouldCallInitViewOnControllers()
        {
            // Arrange
            // Act
            _menuSystem.Init();

            // Assert
            _menuViewController.Received(1).InitView();
            _settingsViewController.Received(1).InitView();
        }
    }
}

And this is the MenuSystem class:

using ArenaClient.UI;
using Zenject;

namespace ArenaClient
{
    public class MenuSystem : ISystem<MenuSystem>
    {
        [Inject]
        private readonly IMenuViewController _menuViewController = null;
        [Inject]
        private readonly ISettingsViewController _settingsViewController = null;


        public void Init()
        {
            _menuViewController.InitView();
            _settingsViewController.InitView();
        }
    }
}

What I have tried so far in Visual Studio and it didn't work:

  • Disabled Just My Code
  • Enabled unsafe code
jps
  • 20,041
  • 15
  • 75
  • 79
Narraxus
  • 41
  • 10

0 Answers0