Using Application Insights with Unit Tests?

前端 未结 5 2119
时光取名叫无心
时光取名叫无心 2020-12-14 08:15

I have an MVC web app, and I\'m using Simple Injector for DI. Almost all my code is covered by unit tests. However, now that I\'ve added some telemetry calls in some contr

5条回答
  •  佛祖请我去吃肉
    2020-12-14 08:37

    I had a lot of success with using Josh Rostad's article for writing my mock TelemetryChannel and injecting it into my tests. Here's the mock object:

    public class MockTelemetryChannel : ITelemetryChannel
    {
        public ConcurrentBag SentTelemtries = new ConcurrentBag();
        public bool IsFlushed { get; private set; }
        public bool? DeveloperMode { get; set; }
        public string EndpointAddress { get; set; }
    
        public void Send(ITelemetry item)
        {
            this.SentTelemtries.Add(item);
        }
    
        public void Flush()
        {
            this.IsFlushed = true;
        }
    
        public void Dispose()
        {
    
        }
    }    
    

    And then in my tests, a local method to spin-up the mock:

    private TelemetryClient InitializeMockTelemetryChannel()
    {
        // Application Insights TelemetryClient doesn't have an interface (and is sealed)
        // Spin -up our own homebrew mock object
        MockTelemetryChannel mockTelemetryChannel = new MockTelemetryChannel();
        TelemetryConfiguration mockTelemetryConfig = new TelemetryConfiguration
        {
            TelemetryChannel = mockTelemetryChannel,
            InstrumentationKey = Guid.NewGuid().ToString(),
        };
    
        TelemetryClient mockTelemetryClient = new TelemetryClient(mockTelemetryConfig);
        return mockTelemetryClient;
    }
    

    Finally, run the tests!

    [TestMethod]
    public void TestWidgetDoSomething()
    {            
        //arrange
        TelemetryClient mockTelemetryClient = this.InitializeMockTelemetryChannel();
        MyWidget widget = new MyWidget(mockTelemetryClient);
    
        //act
        var result = widget.DoSomething();
    
        //assert
        Assert.IsTrue(result != null);
        Assert.IsTrue(result.IsSuccess);
    }
    

提交回复
热议问题