Slide 1

Slide 1 text

Moq Mocking Framework for .NET USAMI Kosuke Fenrir Inc.

Slide 2

Slide 2 text

ࣗݾ঺հ » Ӊࠤݟެี (@usamik26) » ϑΣϯϦϧגࣜձࣾ » iOS (Swift) » Xamarin.iOS (C#)

Slide 3

Slide 3 text

ςετμϒϧ

Slide 4

Slide 4 text

୯ମςετʹ͓͚ΔҎԼͷΑ͏ͳ໰୊ » ςετର৅ͷґଘΦϒδΣΫτ͕ɾɾɾ » ωοτϫʔΫ௨৴͕ඞཁʁ » σʔλϕʔεΞΫηε͕ඞཁʁ » ͦͷ··Ͱ͸୯ମςετΛ࡞Γʹ͍͘

Slide 5

Slide 5 text

ςετμϒϧ » ࣮ࡍͷΦϒδΣΫτͷ୅ΘΓΛ༻ҙ͢Δ » ςετμϒϧʹςετ༻ͷ୅໾ΦϒδΣΫτ » ໾ׂʹԠͯ͡ɺελϒɺϞοΫɺϑΣΠΫɺͳͲʹ෼ྨͰ͖Δ » ʢͦΕΒͷҧ͍ʹ͍ͭͯ͸͜͜Ͱ͸ׂѪʣ

Slide 6

Slide 6 text

No content

Slide 7

Slide 7 text

యܕతͳςετμϒϧͷ࣮૷ » ຊ෺ͱಉ͡ I/F Λ࣋ͭ » ௨৴ͳͲͷৼΔ෣͍͸͠ͳ͍ » ಛఆͷೖྗ͕౉͞ΕΔͱɺಛఆͷग़ྗΛฦ͢

Slide 8

Slide 8 text

ςετμϒϧΛ࣮૷͢Δͱ͖ͷ໰୊ » ຊ෺ͱಉ͡ I/F Λ࣮૷͢Δͷͬͯ݁ߏΊΜͲ͍͘͞ » ୯ମςετͷͨΊʹͦ͜·ͰؤுΔͷʁ » αϙʔτͯ͘͠ΕΔϥΠϒϥϦ͕͋Δͱخ͍͠

Slide 9

Slide 9 text

ϥΠϒϥϦ » OCMock : iOS (Objective-C) » Mockito : Android (Java / Kotlin) » Moq : .NET / Xamarin (C#)

Slide 10

Slide 10 text

Moq

Slide 11

Slide 11 text

Moq » Mocking Framework for .NET » https://github.com/moq/moq4 » ൃԻ͸ʮϞοΫʯ͔ʮϞοΩϡʯ

Slide 12

Slide 12 text

Moq ͷ࢖͍ํ public interface IHoge { bool DoSomething(string value); } var mock = new Mock(); // interface ͕ࣗಈతʹ࣮૷͞ΕΔ mock.Object.DoSomething("abc"); // -> false

Slide 13

Slide 13 text

஫ҙ (1) interface ͕ඞཁ » ஔ͖׵͍͑ͨΦϒδΣΫτͷ interface Λఆٛ͢Δ » ຊ෺ͷ class ͸ͦͷ interface Λ࣮૷͢Δ » ςετμϒϧ΋ͦͷ interface Λ࣮૷͢Δ » ࢀߟ : ຊ෺ͷ class Λܧঝͯ͠ςετμϒϧʹ͢Δख΋͋Δ

Slide 14

Slide 14 text

ྫɿݻఆ஋Λฦ͢ϓϩύςΟ public interface IHoge { string Name { get; } } var mock = new Mock(); mock.SetupGet(x => x.Name) .Returns("xyz"); var name = mock.Object.Name; // -> "xyz"

Slide 15

Slide 15 text

ྫɿSet ՄೳͳϓϩύςΟ public interface IHoge { string Name { get; set; } } var mock = new Mock(); mock.SetupProperty(x => x.Name, "xyz"); mock.Object.Name = "123"; var name = mock.Object.Name; // -> "123"

Slide 16

Slide 16 text

ྫɿಛఆͷೖྗʹಛఆͷग़ྗΛฦ͢ public interface IHoge { bool DoSomething(string value); } var mock = new Mock(); mock.Setup(x => x.DoSomething("abc")) .Returns(true); mock.Object.DoSomething("abc"); // -> true

Slide 17

Slide 17 text

ྫɿೖྗͷ৚݅Λࢦఆ͢Δ public interface IHoge { bool DoSomething(string value); } var mock = new Mock(); mock.Setup(x => x.DoSomething(It.Is(s => s.Length < 10))) .Returns(true); mock.Object.DoSomething("abc"); // -> true

Slide 18

Slide 18 text

ྫɿೖྗ಺༰ʹԠͨ͡ग़ྗΛฦ͢ public interface IHoge { string DoSomething(string value); } var mock = new Mock(); mock.Setup(x => x.DoSomething(It.IsAny())) .Returns(s => s.ToUpper()); mock.Object.DoSomething("abc"); // -> "ABC"

Slide 19

Slide 19 text

ςετίʔυ͔Βͷ࢖͍ํ » ࣄલ४උ » Mock ΠϯελϯεΛੜ੒ » Setup ΛͣΒͣΒͱॻ͘ » mock.Object Λऔಘ͢Δ » ςετର৅͸࣮ࡍͷΦϒδΣΫτͷ୅ΘΓʹ mock.Object Λ࢖͏

Slide 20

Slide 20 text

஫ҙ (2) ґଘΦϒδΣΫτͷࠩ͠ସ͑ » ςετର৅͸ class Ͱ͸ͳ͘ interface ʹґଘ͢Δ͜ͱ » ຊ෺ͷΦϒδΣΫτΛςετμϒϧʹࠩ͠ସ͑ΒΕΔΑ͏ʹ͢Δ͜ͱ » ίϯετϥΫλͰ౉͢ɺDI ίϯςφΛ࢖͏ɺɾɾɾ

Slide 21

Slide 21 text

Moq Ԡ༻ฤ » ϓϩύςΟͷఆٛΛ͍͍ͪͪॻ͖ͨ͘ͳ͍ » ྫ֎ͷςετΛ͍ͨ͠ » ಛఆͷॲཧ͕ݺ͹ΕΔͨͼʹฦ͢஋ΛมԽ͍ͤͨ͞ » ಛఆͷॲཧ͕ͪΌΜͱݺ͹Ε͔ͨ֬ೝ͍ͨ͠

Slide 22

Slide 22 text

ྫɿϓϩύςΟͷఆٛΛָʹ͢Δ public interface IHoge { string Name { get; set; } } var mock = new Mock(); mock.SetupAllProperties();

Slide 23

Slide 23 text

ྫɿྫ֎Λൃੜͤ͞Δ public interface IHoge { bool DoSomething(string value); } var mock = new Mock(); mock.Setup(x => x.DoSomething("abc")) .Throws();

Slide 24

Slide 24 text

ྫɿฦ͢஋ΛมԽͤ͞Δ var mock = new Mock(); mock.SetupSequence(x => x.DoSomething("abc")) .Returns(2) .Returns(1) .Returns(0) .Throws();

Slide 25

Slide 25 text

ྫɿݺͼग़͞Ε͔ͨͲ͏͔Λݕূ͢Δ var mock = new Mock(); mock.Setup(x => x.DoSomething("abc")) .Returns(true); mock.Verify(x => x.DoSomething("abc"), Times.AtLeastOnce());

Slide 26

Slide 26 text

ྫɿݺͼग़͞ΕͨࡍͷॲཧΛهड़͢Δ var mock = new Mock(); mock.Setup(x => x.DoSomething("abc")) .Callback(() => Console.WriteLine("Before returns")) .Returns(true) .Callback(() => Console.WriteLine("After returns"));

Slide 27

Slide 27 text

΍Γ͗͢஫ҙ » ڽΓͩ͢ͱ͍Ζ͍ΖͰ͖Δ͚Ͳɾɾɾ » ͋͘·Ͱςετ༻ͷ୅໾ΦϒδΣΫτ » ୯ମςετͷͱ͖͚ͩ࢖͑Ε͹͍͍ » ຊ෺ʹͳΔඞཁ͸ͳ͍

Slide 28

Slide 28 text

·ͱΊ » ςετμϒϧΛָʹ࡞Δͷʹ Moq ͸ศར » ʢ༨ஊɿSwift ޲͚ͷϥΠϒϥϦ΋ཉ͍͠ʣ