Welcome to the Treehouse Community

Want to collaborate on code errors? Have bugs you need feedback on? Looking for an extra set of eyes on your latest project? Get support with fellow developers, designers, and programmers of all backgrounds and skill levels here with the Treehouse Community! While you're at it, check out some resources Treehouse students have shared here.

Looking to learn something new?

Treehouse offers a seven day free trial for new students. Get access to thousands of hours of content and join thousands of Treehouse students and alumni in the community today.

Start your free trial

C# Unit Testing in C# Writing Unit Tests Testing Exceptions

Assert.Throws Unit test

Hello I need help to solve the unit test task, where to use Assert.Throws exception

Map.cs
namespace TreehouseDefense
{
    public class Map
    {
        public readonly int Width;
        public readonly int Height;

        public Map(int width, int height)
        {
            if(width < 1 || height < 1)
            {
                throw new System.ArgumentOutOfRangeException(
                    "Map must be at least 1x1");
            }

            Width = width;
            Height = height;
        }

        public bool OnMap(Point point)
        {
            return point.X >= 0 && point.X < Width && 
                   point.Y >= 0 && point.Y < Height;
        }
    }
}
MapTests.cs
using Xunit;

namespace TreehouseDefense.Tests
{
    public class MapTests
    {
        [Fact]
        public void OnMapTest()
        {
            var target = new Map(3, 3);
            var point = new Point(0, 0);

            Assert.True(target.OnMap(point));
        }

        public void MapTest() {

                Map map = new Map(0,0);
             Assert.ThrowsArgumentOutOfRangeException;
        }
    }
}
Point.cs
using System;

namespace TreehouseDefense
{
    public class Point
    {
        public readonly int X;
        public readonly int Y;

        public Point(int x, int y)
        {
            X = x;
            Y = y;
        }

        public double DistanceTo(Point point)
        {
            return Math.Sqrt(Math.Pow(X - point.X, 2.0) + Math.Pow(Y - point.Y, 2.0));
        }
    }
}

2 Answers

Steven Parker
Steven Parker
229,744 Points

You're close, here's a few hints to help you finish:

  • the method is Assert.Throws, and the exception name must be enclosed in angle brackets ("<>")
  • the method also takes a function as an argument
  • you should perform the invalid map creation inside that function (instead of before)
Mohammad Laif
PLUS
Mohammad Laif
Courses Plus Student 22,297 Points

Assert.Throws<T>(Test code);

  • Specified the Exception inside "<T>" of Assert.Throws<> you want to test if it throws.
  • Inside the (Test code) write a lambda that create a new map out side the range.
  • Don't forget to add "using System at the first lines".
using Xunit;
using System;

namespace TreehouseDefense.Tests
{
    public class MapTests
    {
        [Fact]
        public void OnMapTest()
        {
            var target = new Map(3, 3);
            var point = new Point(0, 0);

            Assert.True(target.OnMap(point));
        }

        [Fact]
        public void MapTest()
        {
            Assert.Throws<ArgumentOutOfRangeException>(() => new Map(-1, 0));
        }

    }
}