小程序第一次登录失败,第二次成功问题(2)

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了小程序第一次登录失败,第二次成功问题(2)相关的知识,希望对你有一定的参考价值。

参考技术A 小程序登录第一次总是会失败,第二次肯定成功pad block corrupted

<meta charset="utf-8">

在开发微信小程序过程中,遇到一个登录的问题。就是微信小程序登录操作的时候,第一次总是会失败,返回 pad block corrupted ,然后再次登录的时候就会登录成功。出现这样的错误,百度原因大多数是说 session_key 过期,到期去解密手机号数据的时候,解密出错。具体分析:

img

这里描述的问题是出现在第四步的步骤中,原因是第三步获取的 session_key 不正确,导致解密操作错误,返回 pad block corrupted 。但是导致 session_key 不正确的原因是第二步调用 wx.login() 方法,会刷新 session_key 。因为第一步获取的手机号加密数据是通过原来的 session_key 加密的,现在 session_key 刷新了,导致后台在第三步去获取 seesion_key 的时候,获取的是新的 seesion_key ,然后去解密的时候就报错了。

Moq:设置一个模拟方法在第一次调用时失败,在第二次调用时成功

【中文标题】Moq:设置一个模拟方法在第一次调用时失败,在第二次调用时成功【英文标题】:Moq: Setup a mocked method to fail on the first call, succeed on the second 【发布时间】:2011-10-26 02:34:59 【问题描述】:

使用 Moq 模拟一个在第一次调用时会抛出异常,然后在第二次调用时成功的方法的最简洁的方法是什么?

【问题讨论】:

Moq 4.2 及更高版本现在通过SetupSequence() 支持此功能。 【参考方案1】:

到目前为止,我想出的最好的是:

interface IFoo

    void Bar();


[Test]
public void TestBarExceptionThenSuccess()

    var repository = new MockRepository(MockBehavior.Default);
    var mock = repository.Create<IFoo>();

    mock.Setup(m => m.Bar()).
        Callback(() => mock.Setup(m => m.Bar())). // Setup() replaces the initial one
        Throws<Exception>();                      // throw an exception the first time

    ...

【讨论】:

+1 这是一个很酷的方法。偶然发现代码的人可能不清楚那里发生了什么。 不错,没想到这个! 请注意,替换模拟会清除历史记录,因此您无法执行mock.Verify(m =&gt; m.Bar(), Times.Exactly(2))【参考方案2】:

我会使用Callback 并增加一个计数器来确定是否从Callback 抛出异常。

[Test]
public void TestMe()

    var count = 0;
    var mock = new Mock<IMyClass>();
    mock.Setup(a => a.MyMethod()).Callback(() =>
        
            count++;
            if(count == 1)
                throw new ApplicationException();
        );
    Assert.Throws(typeof(ApplicationException), () => mock.Object.MyMethod());
    Assert.DoesNotThrow(() => mock.Object.MyMethod());


public interface IMyClass

    void MyMethod();

【讨论】:

这是一个很好的答案,一旦您希望发生 2 件以上的事情,这种方法就会变得更可取。 这种方法很简单,很好,但请查看@Mathias 回答中 Phil Haack 的帖子。它很光滑。使用扩展方法你可以做类似reader.Setup(r =&gt; r.Read()).ReturnsInOrder(true, true, false); ReturnsInOrder() 如果你想返回一个值序列,那么它很好,但是如何使用它来抛出异常作为序列的一部分并不明显。 这个答案没有错,但使用SetupSequence 肯定更容易、更优雅。检查@aghidini 的答案。【参考方案3】:

Phil Haack 有一个有趣的blog post 来设置一个返回特定结果序列的方法。看起来这将是一个很好的起点,涉及一些工作,因为您现在需要的不是特定类型的值序列,而是可能是 T 类型或异常的结果序列。

【讨论】:

【参考方案4】:

从 Moq 4.2 开始,您可以只使用内置方法 SetupSequence()(如 @RichardBarnett 评论所述)。

例子:

var mock = new Mock<IMyClass>();
mock.SetupSequence(x => x.MyMethod("param1"))
    .Throws<MyException>()
    .Returns("test return");

【讨论】:

这仅在MyMethod 具有返回类型时才有效。如果方法是void,那么你不能使用这种方法。如果有办法用void 方法做到这一点会很好

以上是关于小程序第一次登录失败,第二次成功问题(2)的主要内容,如果未能解决你的问题,请参考以下文章

谷歌游戏服务登录问题(第一次尝试失败,第二次成功)

python小程序—登录账户失败三次,账户自动锁定

微信小程序:wx.login和getPhonenumber获取手机号解密失败问题

小程序echarts数据不改变,或者是一次渲染成功,第二次进入,渲染失败的解决办法

首次运行时Excel VBA授权失败,第二次运行正常运行

登录表单在第一次尝试在实时服务器上失败,但在第二次或第三次尝试