zoukankan      html  css  js  c++  java
  • ABP框架使用(版本3.3.1)

    1.  foreign key constraint failed

    在TestDataBuilder 中已经加了IdentityUser,但测试Application的时候,还是会报错

    TestDataBuilder 

            private async Task AddUsers()
            {
                var adminUser = new IdentityUser(_guidGenerator.Create(), "administrator", "admin@abp.io");
                adminUser.AddRole(_adminRole.Id);
                adminUser.AddClaim(_guidGenerator, new Claim("TestClaimType", "42"));
                await _userRepository.InsertAsync(adminUser);
    
            }
            protected override void AfterAddApplication(IServiceCollection services)
            {
                _currentUser = Substitute.For<ICurrentUser>();
                _currentUser.Id.Returns(_testData.UserJohnId);
                _currentUser.IsAuthenticated.Returns(true);
                services.AddSingleton(_currentUser);
            }

    这种方法不起作用
    optionsBuilder.UseSqlite($"Filename={databaseName}", x => x.SuppressForeignKeyEnforcement());

    可以在连接字符串里指定不用Foreign Keys参数
    AbpIdentityEntityFrameworkCoreTestModule

    var connection = new SqliteConnection("Data Source=:memory:;Foreign Keys=False");
    

    2. 测试的application方法disable了UOW,会报错Context已经displose

                    await WithUnitOfWorkAsync(async () =>
                {
    ...
    
                });

    3.Substitue 其它

    ISettingProvider _settingProvider = Substitute.For<ISettingProvider>();
                _settingProvider.GetOrNullAsync(Arg.Any<string>()).Returns((string) null);
    _settingProvider.GetOrNullAsync(IdentitySettingNames.Password.RequiredLength).Returns(Task.FromResult("42"));
                services.Replace(ServiceDescriptor.Singleton(_settingProvider));

    Substitue DomainService

        public class ItemManager : DomainService
        {
            public ItemManager()
            {
    
            }
            public virtual  string GetTestData()
            {
                return "GetTestData";
    
            }
    
        }

    Test

            protected override void AfterAddApplication(IServiceCollection services)
            {
                _itemManager = Substitute.For<ItemManager>();
                _itemManager.GetTestData().Returns("MockData");
                services.AddTransient(provider => _itemManager);
            }
    
            [Fact]
            public  void Should_Get_Mock_Data()
            {
                var result = _itemManager.GetTestData();
                result.ShouldBe("MockData");
            }

     但如果DomainService有注入其它参数,就会报错

    Castle.DynamicProxy.InvalidProxyConstructorArgumentsException : Can not instantiate proxy of class:Items.ItemManager.
    Could not find a parameterless constructor.

        public class ItemManager : DomainService
        {
            private IRepository<Item, Guid> _repository;
            public ItemManager(IRepository<Item, Guid> repository)
            {
                _repository = repository;
            }
            public virtual  string GetTestData()
            {
                return "GetTestData";
    
            }
    
        }

    GetRequiredService 获取参数会报错
    System.ArgumentNullException : Value cannot be null. (Parameter 'provider')

    必须将所需的参数Substitue出来传递进去

            protected override void AfterAddApplication(IServiceCollection services)
            {
                // var repository = ServiceProvider.GetRequiredService<IRepository<Item, Guid>>();
                var repository = Substitute.For<IRepository<Item, Guid>>();
                services.AddSingleton(repository);
                _itemManager = Substitute.For<ItemManager>(repository);
                _itemManager.GetTestData().Returns("MockData");
                services.AddTransient(provider => _itemManager);
            }

     4.判断报某种Exception

                var exception = await Assert.ThrowsAsync<UserFriendlyException>(
                    async () => await _testAppService.UpdateAsync(beforeEntity.Id, testDto)
                );
                exception.Code.Contains("Unique").Should().BeTrue();

     5.NSubstitute.Exceptions.CouldNotSetReturnDueToNoLastCallException: Could not find a call to return from.

    Make sure you called Returns() after calling your substitute (for example: mySub.SomeMethod().Returns(value)), and that you are not configuring other substitutes within Returns() (for example, avoid this: mySub.SomeMethod().Returns(ConfigOtherSub())).

    If you substituted for a class rather than an interface, check that the call to your substitute was on a virtual/abstract member. Return values cannot be configured for non-virtual/non-abstract members.

  • 相关阅读:
    scanf的参数类型自动转换
    Gedit中文乱码
    在VirtualBox的Ubuntu虚拟机中与母体Windows共享文件夹
    Win7安vc2008编译报LINK : fatal error LNK1000: Internal error during IncrBuildImage
    贝叶斯后验概率小记
    美国计算机专业最好的前20名学校
    Linux磁盘空间不够怎么办?
    Debian6.0装机过程
    把用户加到sudoers组中的方法
    vi命令手册
  • 原文地址:https://www.cnblogs.com/sui84/p/15171111.html
Copyright © 2011-2022 走看看