DotnetMinorNotes

MoQ

var mock = new Mock<IFoo>();

Het bevenstaande stukje code beschrijft hoe er een mock van een object aangemaakt kan worden

IFoo ding = mock.Object;

.Object geeft het gemockte object zelf terug

IFoo ding = mock.Object { CallBase = true };

Wanneer CallBase op true gezet wordt, worden base classes aangeroepen

Setup

mock.Setup(foo => foo.DoSomething("ping")).Returns(true);

Als DoSomething(...) aangeroepen wordt met "ping" als parameter, wordt er true teruggegeven

mock.Setup(foo => foo.DoSomething("reset")).Throws<InvalidOperationException>();
mock.SetUp(foo => foo.DoSomething("")).Throws<ArgumentException>();

Setup(...) werkt ook op voids.

Protected

using Moq.Protected;

[TestMethod]
public void TestSomething()
{
    var mock = new Mock<CommandBase>();
    mock.Protected()
        .Setup<int>("Execute")
        .Returns(5);

    // More code...
}

Protected() maakt het mogelijk om protected methodes te mocken.

Verify

mock.Verify(foo => foo.DoSomething("ping"));
mock.Verify(foo => foo.DoSomething("ping"), "Custom error message");

Middels de Verify(...) kan er geverifieerd worden of een methode aangeroepen wordt

Times

mock.Verify(foo => foo.DoSomething("ping"), Times.Never);
mock.Verify(foo => foo.DoSomething("ping"), Times.AtLeastOnce());

Aan de verify kan een Times object meegegeven worden.

Getter/setter

mock.VerifyGet(foo => foo.Name, "John doe");
mock.VerifyGet(foo => foo.Name);
mock.VerifySet(foo => foo.Name);

De bovenstaande voorbeelden illustreren het verifyen van getters en setters

mock.SetupAllProperties();

Mockt alle properties

Verifyable

mock.Setup(c => c.Clone()).Returns("Hello").Verifiable();
var target = new DingOmTeTesten(mock.Object);

int result = target.BerekenIets();

mock.VerifyAll();
Assert.AreEqual(5, result);
  1. Er is een mock aanmaakt en deze wordt meegegeven aan DingOmTeTesten
  2. mock.VerifyAll() controleert dat alle Setup(...) cases waarbij een Verifiable() gebruikt wordt, aangeroepen zijn

Callback

mock
    .Setup(foo => foo.DoSomething("ping"))
    .Returns(true)
    .Callback(() => calls++);

Aan de Callback(...) kan een lambda meegegeven worden. Deze wordt uitgevoerd wanneer DoSomething(...) aangeroepen wordt.

Events

mock.Raise(m => m.FooEvent += null, new FooEventArgs(fooValue));

Raise een event op de mock.

mock.Setup(foo => foo.Submit()).Raises(f => f.Sent += null, EventArgs.Empty);

Raise een event op de mock wanneer Submit() aangeroepen wordt.

Mock behavior

Loose

var mock = new Mock<IFoo>(MockBehavior.Loose);
long result = mock.Object.CalculateSomething(10, 20);

result krijgt 0 als waarde. MockBehavior.Loose zorgt ervoor dat de default waarde teruggegeven wordt wanneer er geen setup is gedaan voor de betreffende methode

Dit is de default, wanneer er geen MockBehavior mee wordt gegeven.

Strict

var mock = new Mock<IFoo>(MockBehavior.Strict);
long result = mock.Object.CalculateSomething(10, 20);

Gooit een exception omdat er geen setup gedaan is voor CalculateSomething(...)

Deze manier heeft in de meeste gevallen voorkeur omdat:

RabbitMQ

Een event bus is een soort mailbox waar berichten naar gestuurd kunnen worden

Benodigdheden

Service installeren op machine

– of –

Docker container aanzetten voor RabbitMQ

  1. docker pull rabbitmq:3.6.14-management
    • Management, zodat je kan bekijken welke queues er zijn, welke messages, etc
  2. docker run -d --hostname my-rabbit --name some-rabbit -p 5672:5672 -p 15672:15672 rabbitmq:3.6.14-management
    • 15672 is voor management
    • 5672 is voor C#
  3. Navigeer naar http://localhost:15672
    • Username: guest
    • Password: guest

Als queue kan je je aanmelden bij een exchange. De exchange stuurt, aan de hand van topics, de event naar de juiste queue.

Text encoding

ASCII

American Standard Code for Information Interchange

Er zijn 2 conversies nodig

Zo’n beetje alle toetsen op het toetsenbord

Unicode

ASCII nummers met daarnaast alle andere karakters met hun eigen nummer

UTF-8

Is unicode, maar dan in 8 bits

Maakt gebruik van escape karakters

UTF-16 / UTF-32

Als je chinees bent, heb je alleen maar speciala karakters. Dan heb je dus meer bytes nodig. Hiervoor zijn UTF-16 en UTF-32