1

structモックしたい があります。より複雑なテストでは、この構造体の複数のインスタンスが必要で、それぞれに独自の動作があります。これを容易にするために、ヘルパー メソッドを作成しました。

private MyStruct CreateMock(string toString) {
    var mock = Mock.Create<MyStruct>();
    Mock.Arrange(() => mock.toString()).Returns(toString);
    return mock;
}

このメソッドが複数回呼び出されるテストをデバッグすると、Arrange呼び出しが構造体のすべてのインスタンスに対して上書きされているように見えます (または、インスタンスのモックではなく構造体のモックを使用している可能性があります)。

私はもう試した:

mock.Arrange(m => m.toString()).Returns(toString); // Using Helpers assembly, note the lowercase m at the start of the line.

しかし、役に立たない。構造体の複数のインスタンスを取得するにはどうすればよいですか?

私が使用している: Microsoft Visual Studio Enterprise 2017 バージョン 15.9.17 VisualStudio.15.Release/15.9.17+28307.905 Microsoft .NET Framework バージョン 4.8.03761

インストールされているバージョン: エンタープライズ

JustMock 2020.1.219.1 Telerik JustMock 拡張機能。

追加された例:

using Microsoft.VisualStudio.TestTools.UnitTesting;
using Telerik.JustMock;
using Telerik.JustMock.Helpers;

namespace JustMockFramework
{
    public struct MyStruct
    {
        public readonly string Id;

        public MyStruct(string id)
        {
            Id = id;
        }

        public new string ToString()
        {
            return "Never read me!";
        }
    }

    [TestClass]
    public class MWE
    {
        [TestMethod]
        public void TestSimpleStruct()
        {
            var simpleTest = new MyStruct("1");

            Assert.AreEqual("Never read me!", simpleTest.ToString());
        }

        [TestMethod]
        public void TestMockOfStruct()
        {
            var mock = Mock.Create<MyStruct>();
            Mock.Arrange(() => mock.ToString()).Returns("Read me!");

            Assert.AreEqual("Read me!", mock.ToString());
        }

        [TestMethod]
        public void TestTwoMocksOfStruct()
        {
            var firstMock = Mock.Create<MyStruct>();
            Mock.Arrange(() => firstMock.ToString()).Returns("Read me!");

            var secondMock = Mock.Create<MyStruct>();
            Mock.Arrange(() => secondMock.ToString()).Returns("Read me too!");

            Assert.AreEqual("Read me!", firstMock.ToString()); // Fails with "Read me too!"
            Assert.AreEqual("Read me too!", secondMock.ToString());
        }

        [TestMethod]
        public void TestTwoMocksOfStructCreatedInHelper()
        {
            var firstMock = CreateMockOfStruct("Read me!");

            var secondMock = CreateMockOfStruct("Read me too!");

            Assert.AreEqual("Read me!", firstMock.ToString()); // Fails with "Read me too!"
            Assert.AreEqual("Read me too!", secondMock.ToString());
        }

        private MyStruct CreateMockOfStruct(string toString)
        {
            var mock = Mock.Create<MyStruct>();
            Mock.Arrange(() => mock.ToString()).Returns(toString);
            return mock;
        }

        [TestMethod]
        public void TestTwoMocksOfStructCreatedInHelperWithHelper()
        {
            var firstMock = CreateMockOfStructWithHelper("Read me!");

            var secondMock = CreateMockOfStructWithHelper("Read me too!");

            Assert.AreEqual("Read me!", firstMock.ToString()); // Fails with "Read me too!"
            Assert.AreEqual("Read me too!", secondMock.ToString());
        }

        private MyStruct CreateMockOfStructWithHelper(string toString)
        {
            var mock = Mock.Create<MyStruct>();
            mock.Arrange((m) => m.ToString()).Returns(toString);
            return mock;
        }
    }
}

編集:クロスポスト

この質問をTelerik JustMock フォーラムに相互投稿しま​​した

編集:ライセンスが延長されました

私の試用ライセンスは、丁重に延長されました。これを反映するように回答を更新しました。

4

3 に答える 3

0

これらのタイプのシナリオでは、Autofixture を使用する必要があります。 https://github.com/AutoFixture/AutoFixture

于 2020-04-17T11:35:20.573 に答える